假设我有这段代码:
class A {
};
class B: virtual public A {
};
class C: virtual public A {
};
class D: public B,public C, virtual public A {
};
如果D
继承了B
和C
,虚继承可以保证只有一份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
中会有两个拷贝吗?这是否意味着 B
和 AToo
都应该对 A
使用虚拟继承,以确保 ATooB
只有一份?
最佳答案
一个 - 这是 virtual
继承的预期用途。 A
只有一个拷贝。
您实际上可以很容易地验证这一点。给 A
一个成员并使用 D
实例修改它。如果 A
有多个拷贝,编译器会说访问不明确。
Edit在编辑的问题中,会出现两份A,每次A
被定时继承(不带virtual
),一个制作了 A 的新拷贝。如果你想要一个拷贝,每次都将其声明为virtual
。
关于c++ - c++中虚继承是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5910301/