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對象的一份拷貝,所以不會亂,普通繼承會報錯。