c++中的虚拟继承是什么?
what is virtual inheritance in 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
再次使用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
会有两个副本吗?这是否意味着B
和AToo
都应该对A
使用虚拟继承,以确保ATooB
只有一个副本?
1 -这是virtual
继承的预期用途。A
只有一个副本。
你可以很容易地验证它。给A
一个成员,并使用D
实例修改它。如果A
有多个副本,编译器会认为访问是二义性的。
Edit在编辑的题目中,会有两个a的副本。每次定期继承A
(没有virtual
),都会生成一个新的a副本。如果你想要一个副本,每次声明它为virtual
。
来自标准文档。, 10.1.4 ,
…对于指定为virtual的每个不同基类,最派生的对象应包含该类型的单个基类子对象. ....
是的,只有一个
相关文章:
- 私下继承C++抽象基类是什么意思
- 该结构继承的类型是什么
- QT:私人会员而不是继承?原因是什么?这是一个具体的概念吗?
- 停止线程的方法是什么(当我直接从Qthread继承时)
- 从lambda继承是什么意思
- 在C++中,继承超类的正确方法是什么,以便它们的子类在超级类和子类中没有重复的属性?
- 继承Java集合接口(Set、Map、List等)的C++等价物是什么?或者扩展AbstractCollection
- 什么是多重继承
- 在虚拟继承中构造函数调用的顺序是什么
- 使用继承来减少重复代码的缺点是什么
- C#中从指定类型继承的模板类的等效项是什么
- C++:处理这种多重继承的最佳方法是什么
- 动态检查使用可变继承的类的类型的最佳方法是什么
- 继承类之间的枚举的最佳实践是什么?
- 具有不同参数的继承类构造函数的术语是什么
- 如果使单一实例构造函数受到保护,缺点是什么 - 继承 - C++11.
- 模板构造函数继承的标准符合语法是什么
- 如何访问类变量?公共方法/getters与继承.优点和缺点是什么
- 什么是私有继承,它解决了哪些问题
- 在c++中使用多态性和继承来处理一篮子水果的正确方法是什么?