C++基础:派生类的构造函数与析构函数调用顺序
2016-07-20 22:34
459 查看
派生类的构造函数与析构函数调用顺序:
派生类的构造函数的定义形式为:
派生类名::派生类名(参数总表):基类名1(参数表1),基类名2(参数表2),成员对象名1(成员对象参数表1),成员对象名2(成员对象参数表2)
{
…… //派生类新增成员的初始化;
} //所列出的成员对象名全部为新增成员对象的名字
在构造函数的声明中,冒号及冒号以后部分必须略去。
冒号后的基类名,成员对象名的次序可以随意,这里的次序与调用次序无关。
析构函数的调用与构造函数相反。
派生类构造函数各部分的执行次序为:
1.调用基类构造函数,按它们在派生类定义的先后顺序,顺序调用。
2.调用成员对象的构造函数,按它们在类定义中声明的先后顺序,顺序调用
3.派生类的构造函数体中的操作。
Create Base1 //1.
Create Base2
Create Base3
Create Base3 //2.
Create Base2
Create Base1
Create D //3.
Free D
Free Base1
Free Base2
Free Base3
Free Base3
Free Base2
Free Base1
注意:
*在派生类构造函数中,只要基类不是使用缺省构造函数都要显式给出基类名和参数表。
*如果基类没有定义构造函数,则派生类也可以不定义,全部采用系统给定的缺省构造函数。
*如果基类定义了带有形参表的构造函数时,派生类就应当定义构造函数。
派生类的构造函数的定义形式为:
派生类名::派生类名(参数总表):基类名1(参数表1),基类名2(参数表2),成员对象名1(成员对象参数表1),成员对象名2(成员对象参数表2)
{
…… //派生类新增成员的初始化;
} //所列出的成员对象名全部为新增成员对象的名字
在构造函数的声明中,冒号及冒号以后部分必须略去。
冒号后的基类名,成员对象名的次序可以随意,这里的次序与调用次序无关。
析构函数的调用与构造函数相反。
<span style="font-size:18px;">#include <iostream> using namespace std; class Base1 { public: Base1(int d1):data1(d1) { cout<<"Create Base1"<<endl; } ~Base1() { cout<<"Free Base1"<<endl; } private: int data1; }; class Base2 { public: Base2(int d2):data2(d2) { cout<<"Create Base2"<<endl; } ~Base2() { cout<<"Free Base2"<<endl; } private: int data2; }; class Base3 { public: Base3(int d3):data3(d3) { cout<<"Create Base3"<<endl; } ~Base3() { cout<<"Free Base3"<<endl; } private: int data3; }; class D : public Base1,public Base2, public Base3 { public: D(int a,int b,int c,int x,int y,int z):Base1(a),Base2(b),Base3(c),b3(x),b2(y),b1(z) //参数列表初始化 { cout<<"Create D"<<endl; } ~D() { cout<<"Free D"<<endl; } private: Base3 b3; Base2 b2; Base1 b1; }; int main() { D d(1,2,3,4,5,6); return 0; } </span>
派生类构造函数各部分的执行次序为:
1.调用基类构造函数,按它们在派生类定义的先后顺序,顺序调用。
2.调用成员对象的构造函数,按它们在类定义中声明的先后顺序,顺序调用
3.派生类的构造函数体中的操作。
Create Base1 //1.
Create Base2
Create Base3
Create Base3 //2.
Create Base2
Create Base1
Create D //3.
Free D
Free Base1
Free Base2
Free Base3
Free Base3
Free Base2
Free Base1
注意:
*在派生类构造函数中,只要基类不是使用缺省构造函数都要显式给出基类名和参数表。
*如果基类没有定义构造函数,则派生类也可以不定义,全部采用系统给定的缺省构造函数。
*如果基类定义了带有形参表的构造函数时,派生类就应当定义构造函数。
相关文章推荐
- C++ 处理文件结束符的两种不同方式
- C++基础:继承访问属性
- 图书管理系统(c语言课程设计)
- C++提高5 STL算法 :查找,统计,排序,拷贝,替换,算术,集合 |STL 案例:学校演讲比赛介绍
- 备忘录模式-c++实现
- 大话设计模式03----单一职责原则
- 已知先序、中序求后序;已知中序、后序求先序(C++)
- 大数运算模板(C语言)
- 动态规划的思考(三)
- 代刷题目分类(二)
- 大话设计模式02----商场促销-策略模式
- Combinations
- C++中关于堆和栈的说法,哪个是错误的:
- C++ Learning (1)
- C++不是类型安全的语言
- 读书笔记:Effective C++(二)
- C语言中FILE相关与CodeBlocks命令行(windows)
- C语言之内存覆盖
- c++11多线程 生产者-消费者模型/条件变量condition_variable
- C++的类为什么要用指针