B和C都继承A,D继承B,又继承C,如下图:
普通继承中,每继承一次就保留一份间接基类,而虚继承只保留一份!
class A
{
public:
int i;
void showa(){cout<<"i="<<i<<endl;}
};
class B:virtual public A //此处采用虚继承
{
public:
int j;
};
class C:virtual public A //此处采用虚继承
{
public:
int k;
};
class D:public B,public C
{
public:
int m;
};
int main()
{
A a;
B b;
C c;
a.i=1;
a.showa();
b.i=2;
b.showa();
c.i=3;
c.showa();
D d;
d.i=4;
d.showa();
return 0;
}
运行结果:
子类D中只有a对象的一份拷贝,所以不会乱,普通继承会报错。