虚继承
利用关键字virtual限定继承关系例如:
class A :virtual public B{
...
};
虚继承的好处
当继承关系很复杂时,保证只有一份基类的数据。例如:
#include <iostream>
using namespace std;
class A
{
int a=10;
public:
A(){ cout<<"A"<<endl;}
};
class B
{
public:
B() { cout<<"B"<<endl;}
};
class B1: virtual public B, virtual public A{
public :
B1(int i){ cout<<"B1"<<endl;}
};
class B2: public A,virtual public B{
public :
B2(int i){ cout<<"B2"<<endl;}
};
class D:public B1, public B2{
public:
D(int m,int n):B1(m), B2(n){cout<<"D"<<endl;}
A a;
};
int main()
{
D d(1,2);
return 0;
}
输出为:
B
A
B1
A
B2
A
D
关键点在于class B2: public A,virtual public B所以构造B2时采用的是虚继承,所以不会再次构造B,不会输出“B”,可以与A做对比。
最后输出两个A与D,构造一个类时,会先构造它的成员,再执行它的构造函数。