使用虚拟基类的C ++ Downcasting

时间:2014-01-29 21:12:12

标签: c++ oop

我已使用以下界面定义了我的项目:

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_castiA投射到A,但我真的不想这样做。

我必须采用这种方式进行投射的情况如下: 接口iA定义了函数doSomething(iA* a)。我在类A中实现了这个函数。在函数内部,我需要A的一些成员(不是iA的成员),所以我必须将iA* a投射到A*。这个演员是安全的,因为我知道iA*A类型的对象,因为使用的实现存在ABC(否则,函数doSomething()将永远不会在类A中调用。

这是一个糟糕的设计吗?我如何改进此设计以避免需要dynamic_cast

问候

1 个答案:

答案 0 :(得分:2)

引入接口后,您不能假设实现iA的类是A(它可能是任何可能的[A0,A1,... An]。

留下两个选择:

  • 删除接口
  • 使用dynamic_cast