虚继承的使用
#include <iostream>
//多重继承 菱形继承和虚继承
using namespace std;
class A{
public:
int x;
A(int a=100):x(a){cout<<"构造了一个A"<<endl;}
};
class B:virtual public A{
public:
B(int a=0):A(a){cout<<"构造了一个B"<<endl;}
void f(){cout<<"我很帅...."<<endl;}
};
class C:virtual public A{
public:
C(int a=0){cout<<"构造了一个C"<<endl;}
void f(){cout<<"我很帅"<<endl;}
};
class D:public B,public C{
public:
D(int a){
x=a;//函数内x代表的是子类的x,初始化列表的x代表的是父类的x
cout<<"构造了一个D "<<endl;}
};
int main()
{
D d(200);
d.B::f();
B b(20);//当定义B对象时只调用一次A
cout<<d.x<<endl;
return 0;
}
/*virtual public 虚继承 第三代以下D解决重复调用祖父基类A的构造函数
* 虚继承保证A只被执行一次
构造了一个A
构造了一个B
构造了一个C
构造了一个D
*/
/*菱形继承 B-A, C-A ,D-B-C, 第三代以下D会重复调用祖父基类A的构造函数,A执行两次
构造了一个A
构造了一个B
构造了一个A
构造了一个C
构造了一个D
*/