仍在学习C ++的基础知识
我对多重继承中的虚拟关键字有一个非常简单的查询。 我有以下代码:
class A {};
class B : public A {};
//1. class C : public A, public B {};
//2. class C : virtual public A, public B {};
//3. class C : public A, virtual public B {};
//4. class C : virtual public A, virtual public B {};
int main() {
C f;
return 0;
}
现在我知道(通过实际尝试此代码),1和3,这两种情况下我们在继承A类工作时不使用虚拟关键字。
我理解这是多重继承的Diamond问题,当我在B类中继承A类作为虚拟时,编译器错误消失了:
class B: virtual public A
但我想试验一下代码并将其删除。
我的问题是,当我们使用虚拟继承A类时,为什么创建C类对象失败?
注意:我找不到一篇好文章来解释深入这个虚拟关键字的含义以及编译器如何读取它以及阅读虚拟关键字后编译器做了什么
编辑:
这是我正在做的实验,所以没有实际用途(对我个人而言)。
何时这样做:
class A {}; class B : public A {}; class C : virtual public A, virtual public B {}; int main() { C f; return 0; }
编译器抛出错误:错误C2584:' C':直接基础' A'无法进入;已经是' B'
的基础