一、派生类的基类还有共同的基类,且基类继承方式为virtual
class A{
public:
int b;
A(string &p){
s = p;
cout << "This is Class A G:" << p << endl;
}
~A(){
cout << "This is Class A X:" << s << endl;
}
private:
string s;
};
class B1:virtual public A{
public:
B1(string &p):A(p){
sb1 = p;
cout << "This is Class B1 G:" << p << endl;
}
~B1(){
cout << "This is Class B1 X:" << sb1 << endl;
}
private:
string sb1;
};
class B2 :virtual public A{
public:
B2(string &p):A(p){
sb2 = p;
cout << "This is Class B2 G:" << p << endl;
}
~B2(){
cout << "This is Class B2 X:" << sb2 << endl;
}
private:
string sb2;
};
class C :public B1, public B2{
private:
string sc;
public:
C(string &p):B1(p),B2(p),A(p){ //特别注意!!加virtural的时候,还要加上类A的构造函数
sc = p;
cout << "This is Class C G:" << p << endl;
}
~C(){
cout << "This is Class C X:" << sc << endl;
}
};
virtual继承说明:
- 如上程序,B1 B2为virtual继承时,C的初始化列表中必须加上A的构造函数,即使C不为多继承,仅继承B1,其初始化列表也要加上A的构造函数初始化
- virtual继承后,C中仅有一个b,属于A类,而不存在B1::b和B2::b
- virtual继承后,仅执行一遍A类的构造函数,且是第一个执行的,之后再按继承顺序执行直接继承类的构造函数
二、派生类的基类还有共同的基类,且基类继承方式不为virtual
class A{
public:
int b;
A(string &p){
s = p;
cout << "This is Class A G:" << p << endl;
}
~A(){
cout << "This is Class A X:" << s << endl;
}
private:
string s;
};
class B1: public A{
public:
B1(string &p):A(p){
sb1 = p;
cout << "This is Class B1 G:" << p << endl;
}
~B1(){
cout << "This is Class B1 X:" << sb1 << endl;
}
private:
string sb1;
};
class B2 : public A{
public:
B2(string &p):A(p){
sb2 = p;
cout << "This is Class B2 G:" << p << endl;
}
~B2(){
cout << "This is Class B2 X:" << sb2 << endl;
}
private:
string sb2;
};
class C :public B1, public B2{
private:
string sc;
public:
C(string &p):B1(p),B2(p){ //不加virtural的时候,就不用加上A的构造函数
sc = p;
cout << "This is Class C G:" << p << endl;
}
~C(){
cout << "This is Class C X:" << sc << endl;
}
};
说明:
- 第二基类不为virtual继承时,派生类不需要在其构造函数初始化列表中初始化第一基类,由其父类(第二基类)初始化时对第一基类进行初始化,且此时派生类中存在多个第一基类中的变量,分别属于其不同的父类,如上,B1::b,B2::b
- 构造函数的执行顺序,是派生类继承时声明的顺序,且第一基类的构造函数要执行多次(如上,A的构造函数执行了两次)
三、派生类的基类一个是virtual,一个是非virtual时
class A{
public:
int b;
A(string &p){
s = p;
cout << "This is Class A G:" << p << endl;
}
~A(){
cout << "This is Class A X:" << s << endl;
}
private:
string s;
};
class B1: public A{
public:
B1(string &p):A(p){
sb1 = p;
cout << "This is Class B1 G:" << p << endl;
}
~B1(){
cout << "This is Class B1 X:" << sb1 << endl;
}
private:
string sb1;
};
class B2 :virtual public A{
public:
B2(string &p):A(p){
sb2 = p;
cout << "This is Class B2 G:" << p << endl;
}
~B2(){
cout << "This is Class B2 X:" << sb2 << endl;
}
private:
string sb2;
};
class C :public B1, public B2{
private:
string sc;
public:
C(string &p):B1(p),B2(p),A(p){ //这里报错,说A的构造函数执行时不明确,所以不能这么搞
sc = p;
cout << "This is Class C G:" << p << endl;
}
~C(){
cout << "This is Class C X:" << sc << endl;
}
};