c++中的虚拟继承是什么?

what is virtual inheritance in c++

本文关键字:是什么 继承 虚拟 c++      更新时间:2023-10-16

假设我有以下代码:

class A {
};
class B: virtual public A {
};
class C: virtual public A {
};
class D: public B,public C, virtual public A {
};

如果D继承了BC,则虚拟继承可以保证D中只包含一个A副本;但是如果D再次使用virtual public A继承A,就像上面的代码一样呢?

是否有一个类型为A的子对象,还是两个?


我仍然对一些带有虚拟继承的表达式感到困惑。例如:

#include <iostream>
using namespace std;
class A {
    public:
    A() {std::cout<<"A ";}
};
class B: A {
    public:
    B() {std::cout<<"B ";}
};
class AToo: virtual A {
    public:
    AToo() {
    std::cout<<"AToo ";
}
};
class ATooB: virtual AToo, virtual B {
    public: 
    ATooB() {
    std::cout<<"ATooB ";
}
};

virtual关键字能否确保ATooB中只有一个A的副本?如果AToo使用虚拟继承从A继承,但B没有,会发生什么?ATooB会有两个副本吗?这是否意味着BAToo都应该对A使用虚拟继承,以确保ATooB只有一个副本?

1 -这是virtual继承的预期用途。A只有一个副本。

你可以很容易地验证它。给A一个成员,并使用D实例修改它。如果A有多个副本,编译器会认为访问是二义性的。

Edit在编辑的题目中,会有两个a的副本。每次定期继承A(没有virtual),都会生成一个新的a副本。如果你想要一个副本,每次声明它为virtual

来自标准文档。, 10.1.4 ,

…对于指定为virtual的每个不同基类,最派生的对象应包含该类型的单个基类子对象. ....

是的,只有一个