带有虚拟基类的C++下播

C++ Downcasting with virtual base class

本文关键字:C++ 下播 基类 虚拟      更新时间:2023-10-16

我已经用如下接口定义了我的项目:

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。我可以删除类A中的virtual关键字,但这样我就会遇到钻石继承问题。我知道我可以使用dynamic_castiA转换为A,但我真的不想这样做。

我不得不这样做的情况如下:接口iA定义了函数CCD_ 7。我在A类中实现了这个函数。在函数内部,我需要A的一些成员(它们不是iA的成员),所以我必须将iA*a强制转换为A*。这个强制转换是安全的,因为我知道iA*A类型的对象,因为使用的实现中存在ABC(否则,函数doSomething()永远不会在类A中调用)。

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

问候

在引入接口后,不能假设实现iA的类是a(它可能是[A0,A1,…an]中的任何一个)。

给你两个选择:

  • 删除接口
  • 使用dynamic_cast