我已使用以下界面定义了我的项目:
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
感谢虚拟,我不受钻石继承问题的影响。但现在,我想将指向iA的指针向下转换为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 :(得分:2)
引入接口后,您不能假设实现iA的类是A(它可能是任何可能的[A0,A1,... An]。
留下两个选择: