я определил свой проект с интерфейсами, как следующие: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
?
Привет
это трудно сказать как улучшить дизайн, не зная деталей. возможно, что он нуждается в редизайне. –
Это наверняка выглядит плохой дизайн для меня. Невозможно сказать, какой будет хороший дизайн, не зная, чего вы пытаетесь достичь. –