【发布时间】:2011-01-14 08:21:23
【问题描述】:
我正在使用许多只定义纯虚函数和一个虚拟(非纯)析构函数的抽象类。
不使用虚拟继承的菱形继承结构还可以吗? (我想确保即使某些程序员不知道他应该使用虚拟继承也不会出现问题。)有什么好的资源可以简短而完整地概述这个主题?
谢谢!
【问题讨论】:
标签: c++ multiple-inheritance diamond-problem
我正在使用许多只定义纯虚函数和一个虚拟(非纯)析构函数的抽象类。
不使用虚拟继承的菱形继承结构还可以吗? (我想确保即使某些程序员不知道他应该使用虚拟继承也不会出现问题。)有什么好的资源可以简短而完整地概述这个主题?
谢谢!
【问题讨论】:
标签: c++ multiple-inheritance diamond-problem
你不能。如果没有虚拟继承,继承图就不是菱形。如果Derived 继承自Left 和Right,并且都从Base 非虚拟派生,那么每个Base 对象将有两个Base 子对象。
【讨论】:
Derived* 获得两个不同的Base* 值。并考虑一个常见的 vtable 实现:Base 两个 suobject 都有自己的 vptr。
虚拟继承是您获得钻石的机制 - 如果您不使用虚拟继承,那么您将获得公共基类的两个不同副本 - 这不再是真正的钻石,可能也不是您想要的。
【讨论】:
This faq 通过示例为多重继承提供了很好的答案。
对于钻石,你必须有虚拟继承。
【讨论】: