1. 顺序
先调用基类的构造函数,再调用派生类构造函数。析构顺序相反。
2. 构造函数
派生类 不用初始化列表调用基类构造函数->调用基类的默认构造函数
派生类 使用初始化列表调用基类带参构造函数->调用基类相关的带参构造函数
若派生类有多个构造函数版本,其中任意一个基类的构造函数不匹配,都会出错。
3. 复制构造函数
派生类 未定义复制构造函数 ->调用基类的复制构造函数(如果有)或默认复制构造函数,和派生类的默认复制构造函数
派生类 定义了复制构造函数 未使用初始化列表调用基类复制构造函数 -> 调用基类默认构造函数
派生类 定义了复制构造函数 使用初始化列表调用基类复制构造函数 -> 调用基类复制构造函数(如果有)或默认复制构造函数
例子:
#include<iostream> using namespace std; class A { public: A() { cout << "A 默认构造函数" << endl; } A(int i) { cout << "A A(int i)构造函数" << endl; } ~A() { cout << "A 析构函数" << endl; } A(const A & obj) { cout << "A 复制构造函数" << endl; } }; class B : public A { public: B() { cout << "B 默认构造函数" << endl; } B(int j):A(j) { cout << "B B(int j):A(j)" << endl; } ~B() { cout << "B 析构函数" << endl; } B(const B & obj) //调用A的默认构造函数 { cout << "B 复制构造函数" << endl; } //B(const B & obj):A() //调用A的默认构造函数 //{ // cout << "B 复制构造函数" << endl; //} //B(const B & obj):A(obj) //调用A的复制构造函数 //{ // cout << "B 复制构造函数" << endl; //} }; int main() { { cout << "----------------------" << endl; B b; cout << "----------------------" << endl; B b1(3); cout << "----------------------" << endl; B b2(b); cout << "----------------------" << endl; } return 0; }