c++ - 虚拟多重继承和类型转换

标签 c++ multiple-inheritance dynamic-cast downcast virtual-inheritance

我尝试创建一个继承自多个类的类,如下所示,得到一个“钻石”
(D继承自B和C。B和C都虚拟继承自A):

  A
  / \
B   C
  \ /
  D

现在,我有一个带有链表的容器,其中包含指向基类 (A) 的指针。
当我尝试对指针进行显式转换时(在 typeid 检查之后),我收到以下错误:
“无法将指向基类“A”的指针转换为指向派生类“D”的指针——基类是虚拟的”

但是当我使用动态转换时,它似乎工作得很好。
任何人都可以向我解释为什么我必须使用动态转换以及为什么虚拟继承会导致此错误?

最佳答案

“虚拟”总是意味着“在运行时确定”。虚函数位于运行时,虚基也位于运行时。虚拟性的全部意义在于所讨论的实际目标是静态不可知的。

因此,不可能在编译时确定为您提供虚拟基的最派生对象,因为基和最派生对象之间的关系是不固定的。您必须等到您知道实际对象是什么,然后才能确定它相对于底座的位置。这就是动态转换正在做的事情。

关于c++ - 虚拟多重继承和类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20750340/

相关文章:

c++ - 虚拟方法会使应用程序变慢,但它们可以加快链接速度吗?

c++ - 选择要覆盖哪个基类的方法

c++ - 如何使用dynamic_cast

c++ - Visual Studio 2010 - 源代码从项目文件夹中消失

c++ - 如何计算 N 个有序集的交集?

python - 如何赋予我的类(class)弦乐感?

c++ - 我避免 dynamic_cast<> 的方法是否比 dynamic_cast<> 本身更快?

c++ - 在 C++Builder 6 中使用自定义颜色

java - 替代多重继承来扩展库