c++ - c++中虚继承是什么

标签 c++ inheritance virtual

假设我有这段代码:

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

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

如果D继承了BC,虚继承可以保证只有一份A包含在 D 中;但是如果 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 只有一份?

最佳答案

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

您实际上可以很容易地验证这一点。给 A 一个成员并使用 D 实例修改它。如果 A 有多个拷贝,编译器会说访问不明确。

Edit在编辑的问题中,会出现两份A,每次A被定时继承(不带virtual),一个制作了 A 的新拷贝。如果你想要一个拷贝,每次都将其声明为virtual

关于c++ - c++中虚继承是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5910301/

相关文章:

c++ - 从基类特定函数调用子类方法

c++ - 如何在没有内存泄漏的情况下同时(线程安全)填充 c++11 std::map<std::string,std::bitset<N>*>?

c++ - 在 QT 对象类中声明一个 PCL 点云

c++ - 继承、模板和虚函数(这可能会变得困惑)

java - 为什么程序打印的高度值是0,而不是我设置的?

C++虚拟克隆方法,异常继承

c++ - HBITMAP/BITMAP 到 BITMAPINFOHEADER -> 通过网络 -> BITMAPINFOHEADER 到 HBITMAP/BITMAP

c++ - 列出迭代段错误

C++ 覆盖函数

windows - 是否有适用于 Windows 的免费或开源虚拟内存驱动器?