继承中的构造和析构
子类对象的构造
-
子类中可以定义构造函数
-
子类构造函数
- 必须对继承而来的成员进行初始化
- 直接通过初始化列表或者赋值的方法进行初始
- 调用父类构造函数进行初始化
- 必须对继承而来的成员进行初始化
-
父类构造数在子类中的调用方式
- 默认调用
- 适用于无参构造函数和使用默认参数的构造函数
- 显示调用
- 通过初始化列表进行调用
- 适用于所有父类构造函数
- 默认调用
构造规则
- 子类对象在创建时会先调用父类的构造函数
- 先执行父类构造函数再执行子类的构造函数
- 父类构造函数可以被隐式调用或者显示调用
对象创建时构造函数的调用顺序
- 调用父类的构造函数
- 调用成员变量的构造函数
- 调用类自身的构造函数
子类的析构函数
析构函数的调用顺序与构造函数相反
- 执行自身的析构函数
- 执行成员变量的析构函数
- 执行父类的析构函数
#include <iostream>
using namespace std;
class Object
{
string om;
public:
Object(string s)
{
om = s;
cout<<"Object(string s) : "<<s<<endl;
}
~Object()
{
cout<<"~Object() : "<<om<<endl;
}
};
class Parent:public Object
{
string pm;
public:
Parent():Object("Default")
{
cout<<"Parent()"<<endl;
}
Parent(string s):Object(s)
{
pm = s;
cout<<"Parent(string s) : "<<s<<endl;
}
~Parent()
{
cout<<"~Parent() : "<<pm<<endl;
}
};
class Child : public Parent
{
Object o1;
Object o2;
string cm;
public:
Child():o1("Default 1"),o2("Default 2")
{
cout<<"Child()"<<endl;
}
Child(string s) : Parent(s),o1(s),o2(s)
{
cout<<"Child(string s) : "<<s<<endl;
}
~Child()
{
cout<<"~Child() : "<<cm<<endl;
}
};
int main(int argc, char const *argv[])
{
Child c;
Child cc("ss");
return 0;
}