继承中的构造析构调用原则
问题:如何初始化父类成员?父类与子类的构造函数有什么关系
- 在子类对象构造时,需要调用父类构造函数对其继承得来的成员进行初始化
在子类对象析构时,需要调用父类析构函数对其继承得来的成员进行清理
- 子类对象在创建时会首先调用父类的构造函数
- 父类构造函数执行结束后,执行子类的构造函数
- 当父类的构造函数有参数时,需要在子类的初始化列表中显示调用
- 析构函数调用的先后顺序与构造函数相反
#include <iostream>
using namespace std;
class Parent
{
public:
Parent(int a, int b)
{
this->a = a;
this->b = b;
cout << "parent 构造函数被调用" << endl;
}
~Parent()
{
cout << "parent 析构函数被调用" << endl;
}
void printP()
{
printf ("a = %d, b = %d\n", a, b);
}
private:
int a;
int b;
};
// 派生类的组成:基类成员 + 派生类自己的成员
// 原则:谁的成员谁自己去初始化,分工明确,
// 基 类:基类自己初始化(调用基类的构造函数) -----> 在对象初始化列表中显示调用基类的构造函数
// 派生类:派生类自己初始化(调用派生类的构造函数)
// 构造:先构造基本、再构造派生类自己
// 析构:与构造顺序相反
class Child :public Parent
{
public:
Child() : Parent(1,2)
{
c = 0;
cout << "Child 构造函数被调用" << endl;
}
~Child()
{
cout << "Child 析构函数被调用" << endl;
}
void printC()
{
printf ("c = %d\n", c);
}
private:
int c;
};
int main()
{
// Parent p(1,2);
Child c;
// 1、派生类的成员是通过叠加父类的成员实现
// 父类的成员变量放在派生类的成员变量之前
cout << "sizeof Child " << sizeof Child << endl;
return 0;
}
执行结果:
parent 构造函数被调用
Child 构造函数被调用
sizeof Child 12
Child 析构函数被调用
parent 析构函数被调用