【问题标题】:what is virtual inheritance in c++c++中的虚拟继承是什么
【发布时间】:2011-08-20 02:22:23
【问题描述】:

我有一个关于 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 又像上面的代码一样使用 virtual 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中只有一个A的副本吗?如果 AToo virtual 继承了 A,而 B 没有,会发生什么? ATooB 中有两个副本?所以这意味着 B 和 AToo 都应该虚拟继承 A 以便在 ATooB 中只保留一个副本?

【问题讨论】:

  • 编辑了我的答案以供您编辑。

标签: c++ inheritance virtual


【解决方案1】:

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

您实际上可以轻松地验证这一点。给A 一个成员并使用D 实例对其进行修改。如果A 的副本不止一份,编译器会说访问不明确。

Edit在已编辑的问题中,会有两个A的副本。每次定期继承A(没有virtual),都会制作一个新的A副本。如果你想要一份,每次都声明virtual

【讨论】:

    【解决方案2】:

    来自标准文档,10.1.4

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

    所以是的,只有一个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-26
      • 2011-01-08
      • 1970-01-01
      • 2011-07-07
      相关资源
      最近更新 更多