2014-01-29 7 views
-1

я определил свой проект с интерфейсами, как следующие:C++ понижающее приведение с виртуальным базовым классом

class iA 
class iB : virtual public iA 
class iC : virtual public iA 

Когда я реализую интерфейсы теперь ..

class A : virtual public iA 
class B : virtual public iB, public A 
class C : virtual public iC, public A 

Благодаря виртуальным, я не страдают в связи с проблемой наследования алмазов. Но сейчас я хочу, чтобы указатель обратного приведения к мке к типу А.

void func1(iA* a){ 
    static_cast<A*>(a); 
} 

Это не представляется возможным, так как виртуальная унаследован от iA. Я мог бы удалить ключевое слово virtual в классе A, но тогда я буду страдать от проблемы наследования алмазов. Я знаю, что могу использовать dynamic_cast, чтобы отличить iA до A, но я действительно НЕ хочу этого делать.

Ситуация, в которой я должен использовать этот способ, такова: Интерфейс iA определяет функцию doSomething(iA* a). Я реализую эту функцию в классе A. Внутри функции мне нужны некоторые члены A (которые не являются членами iA), поэтому я должен отличить iA* a до A*. Этот гипс безопасен, так как я знаю, что iA* является объектом типа A, потому что использовалась реализация, в которой A, B и C (в противном случае функция doSomething() никогда бы не вызывалась в классе A).

Это плохой дизайн? Как я мог улучшить этот дизайн, чтобы избежать необходимости dynamic_cast?

Привет

+0

это трудно сказать как улучшить дизайн, не зная деталей. возможно, что он нуждается в редизайне. –

+0

Это наверняка выглядит плохой дизайн для меня. Невозможно сказать, какой будет хороший дизайн, не зная, чего вы пытаетесь достичь. –

ответ

2

После введения интерфейсов, которые вы не можете предположить, класс реализации мкА является A (это может быть любой из некоторого возможного [A0, A1, ... An].

Оставив два варианта :

  • Капля интерфейсы
  • Использование dynamic_cast
Смежные вопросы