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

时间:2011-05-06 10:51:34

标签: c++ inheritance virtual

我对c ++中的虚拟继承有疑问:

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

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

如果D继承B和C虚拟继承可以确保D中只包含一个A副本,那么D再次使用虚拟公共A继承A,就像上面的代码一样?

所以A类子对象的数量是1还是2?

好的,谢谢你的答案,我理解。但我仍然把一些表达与虚拟继承混淆。 例如:

#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 ";
}
};

虚拟可以确保ATooB中只有一个A副本吗?如果AToo虚拟继承A,但B没有,会发生什么?在ATooB中有两个副本?所以这意味着B和AToo都应该虚拟继承A,以便只在ATooB中保留一个副本吗?

2 个答案:

答案 0 :(得分:11)

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

您实际上可以轻松验证。授予A成员并使用D实例对其进行修改。如果A有多个副本,编译器会说访问不明确。

在编辑的问题中

编辑,将有两份A副本。每次A定期继承(没有virtual),就会制作一份A的新副本。如果您想要一份副本,请每次声明virtual

答案 1 :(得分:4)

来自标准文档。 10.1.4

  

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

所以是的,只有一个。