C++虚继承区别
c++ virtual inheritance difference
给定两个 class 具有共同虚拟基础的 class:
class Base {};
class Derived1 : public virtual Base {};
class Derived2 : public virtual Base {};
这两个进一步派生出来的classes有什么区别吗?:
class Derived3 : public virtual Base, public Derived1, public Derived2 {};
class Derived3 : public Derived1, public Derived2 {};
第一个也直接派生自虚拟基 class,但我认为这没有任何效果,因为它与 Derived1
和 Derived2
共享。
他们说同样的话。唯一的区别是,如果您从 Derived3
的两个定义中删除 public Derived1
和 public Derived2
,第一个仍将继承自 Base
,而第二个则不会。
编辑:我没有仔细考虑是否存在一些奇怪的交叉投射情况,两者也会有不同的行为,尽管我认为没有。
这些例子之间没有区别。
但在更复杂的情况下,直接继承否则继承的虚拟基础可能会改变基础 class 子对象的构造/销毁顺序。
我认为对象布局没有任何区别,因为虚拟继承的目的是避免 Base
的两个副本(或案例 1 中的三个副本)。
所以所有的区别都在于您的意图和代码的真正可读性。
给定两个 class 具有共同虚拟基础的 class:
class Base {};
class Derived1 : public virtual Base {};
class Derived2 : public virtual Base {};
这两个进一步派生出来的classes有什么区别吗?:
class Derived3 : public virtual Base, public Derived1, public Derived2 {};
class Derived3 : public Derived1, public Derived2 {};
第一个也直接派生自虚拟基 class,但我认为这没有任何效果,因为它与 Derived1
和 Derived2
共享。
他们说同样的话。唯一的区别是,如果您从 Derived3
的两个定义中删除 public Derived1
和 public Derived2
,第一个仍将继承自 Base
,而第二个则不会。
编辑:我没有仔细考虑是否存在一些奇怪的交叉投射情况,两者也会有不同的行为,尽管我认为没有。
这些例子之间没有区别。
但在更复杂的情况下,直接继承否则继承的虚拟基础可能会改变基础 class 子对象的构造/销毁顺序。
我认为对象布局没有任何区别,因为虚拟继承的目的是避免 Base
的两个副本(或案例 1 中的三个副本)。
所以所有的区别都在于您的意图和代码的真正可读性。