【专题总结】【一文解决】C++多继承下的构造函数执行顺序
多继承下的构造函数执行顺序
派生类构造函数执行顺序如下
①调用基类构造函数→调用顺序按它们被继承时【从左至右】被说明的次序
②调用子对象的构造函数→调用顺序按它们在【类中说明次序】
③调用派生类的构造函数
【典型题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;
}