c中的虚拟继承是什么?

我有一个关于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使用虚拟public 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中只有一个副本吗?如果AToo虚拟继承A,但B不会,会发生什么?两个副本在ATooB?所以这意味着B和AToo应该虚拟继承A,以便在ATooB内只保留一个副本?

解决方法

一个 – 这是虚拟继承的预期用途.只有一个副本A.

你实际上可以很容易地验证.给一个成员并使用D实例进行修改.如果有多个A的副本,编译器会说访问是不明确的.

在编辑的问题中编辑,将有两个副本A.每次A定期继承(无虚拟)时,将创建一个新的A副本.如果你想要一个副本,每次都声明它是虚拟的.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...