多继承下的构造函数执行顺序
派生类构造函数执行顺序如下
①调用基类构造函数→调用顺序按它们被继承时【从左至右】被说明的次序
②调用子对象的构造函数→调用顺序按它们在【类中说明次序】
③调用派生类的构造函数
【典型题1】13浙工大卷二读程序4题
【分析】下面①classC:public A,public B时A左B右→故先调A构造再调B构造
②B b,A a是子对象(类中定义的对象),类中先说明b再说明a→故先调B构造再调A构造
③最后调派生类C构造
【题2】C++教辅p191例题
【注意】classC:public B,public A时B左A右→故先调B构造再调A构造 [本题没有子对象]
题1代码如下
#include "bits/stdc++.h"
#include<iostream>
using namespace std;
class A{
int a;
public:
A(){
cout<<"调用A的构造"<<endl;
}
};
class B{
int b;
public:
B(){
cout<<"调用B的构造"<<endl;
}
};
class C:public A,public B{ //从类A和B共有派生C【注意】A左B右,先调A构造调B构造
//上面输出1"调用A构造",2"调用B构造"
B b; //子对象b.输出3调用B的构造
A a; //子对象a.输出4调用A的构造
int c;
public:
C(){
cout<<"调用派生类C的构造"<<endl; //最后调用5派生类C构造
}
};
int main(){
C c;
return 0;
}
题2代码如下
#include "bits/stdc++.h"
#include<iostream>
using namespace std;
class A{ //基类A
int a;
public:
A(int i){
a=i;
cout<<"A构造"<<endl;
}
void disp(){
cout<<"A的a="<<a<<endl;
}
};
class B{ //基类B
int b;
public:
B(int j){
b=j;
cout<<"B构造"<<endl;
}
void disp(){
cout<<"B的b="<<b<<endl;
}
};
class C:public B,public A{ //从类A和B共有派生C【注意】B在左A在右,先调B构造再调A构造
int c;
public:
C(int k):A(k-2),B(k+2){ //包含基类成员初始化参数列表
c=k;
cout<<"C构造"<<endl;
}
void disp(){ //C的disp()
A::disp(); //4输出A的a=8
B::disp(); //5输出B的b=12
cout<<"C的c="<<c<<endl; //6输出C的c=10
}
};
int main(){
C obj(10); //输出1B构造,2A构造,3C构造
obj.disp(); //执行C的disp()
return 0;
}