继承中构造函数和析构函数的调用次序
来源:互联网 发布:svn linux登录 编辑:程序博客网 时间:2024/05/21 09:05
1.构造函数
构造函数的调用次序(创建派生类对象时):
首先调用其基类的构造函数(调用顺序按照基类被继承时的声明顺序(从左向右))。
然后调用本类对象成员的构造函数(调用顺序按照对象成员在类中的声明顺序)。
最后调用本类的构造函数。
2.析构函数
撤销派生类对象时析构函数的调用次序与构造函数的调用次序相反:
首先调用本类的析构函数
然后调用本类对象成员的析构函数
最后调用其基类的析构函数
//Demo.h
class C {
public:
C( ); //构造函数
~C( ); //析构函数
};
class BASE {
public:
BASE( ); // 构造函数
~BASE( ) // 析构函数
};
#include “Demo.h” //Demo.cpp
C::C( ) //构造函数
{ cout << "Constructing C object.\n"; }
C:: ~C( ) //析构函数
{ cout << "Destructing C object.\n"; }
BASE::BASE( ) // 构造函数
{ cout << "Constructing BASE object.\n"; }
BASE:: ~BASE( ) // 析构函数
{ cout << "Destructing BASE object.\n"; }
class DERIVED: public BASE { // Derived.h
public:
DERIVED() // 构造函数
~DERIVED() // 析构函数
private:
C mOBJ;
};
#include “Derived.h” // Derived.cpp
DERIVED::DERIVED() // 构造函数
{ cout << "Constructing derived object.\n"; }
DERIVED:: ~DERIVED() // 析构函数
{ cout << "Destructing derived object.\n"; }
#include “Derived.h” // Client.cpp
int main()
{
DERIVED obj; // 声明一个派生类的对象
// 什么也不做,仅完成对象obj的构造与析构
return 0;
}
运行结果:
Constructing BASE object.
Constructing C object.
Constructing derived object.
Destructing derived object.
Destructing C object.
Destructing BASE object.
构造函数的调用次序(创建派生类对象时):
首先调用其基类的构造函数(调用顺序按照基类被继承时的声明顺序(从左向右))。
然后调用本类对象成员的构造函数(调用顺序按照对象成员在类中的声明顺序)。
最后调用本类的构造函数。
2.析构函数
撤销派生类对象时析构函数的调用次序与构造函数的调用次序相反:
首先调用本类的析构函数
然后调用本类对象成员的析构函数
最后调用其基类的析构函数
//Demo.h
class C {
public:
C( ); //构造函数
~C( ); //析构函数
};
class BASE {
public:
BASE( ); // 构造函数
~BASE( ) // 析构函数
};
#include “Demo.h” //Demo.cpp
C::C( ) //构造函数
{ cout << "Constructing C object.\n"; }
C:: ~C( ) //析构函数
{ cout << "Destructing C object.\n"; }
BASE::BASE( ) // 构造函数
{ cout << "Constructing BASE object.\n"; }
BASE:: ~BASE( ) // 析构函数
{ cout << "Destructing BASE object.\n"; }
class DERIVED: public BASE { // Derived.h
public:
DERIVED() // 构造函数
~DERIVED() // 析构函数
private:
C mOBJ;
};
#include “Derived.h” // Derived.cpp
DERIVED::DERIVED() // 构造函数
{ cout << "Constructing derived object.\n"; }
DERIVED:: ~DERIVED() // 析构函数
{ cout << "Destructing derived object.\n"; }
#include “Derived.h” // Client.cpp
int main()
{
DERIVED obj; // 声明一个派生类的对象
// 什么也不做,仅完成对象obj的构造与析构
return 0;
}
运行结果:
Constructing BASE object.
Constructing C object.
Constructing derived object.
Destructing derived object.
Destructing C object.
Destructing BASE object.
0 0
- 继承中构造函数和析构函数的调用次序
- 构造函数和析构函数的调用次序
- 7.23构造函数和析构函数的调用次序
- 单继承,构造函数的调用次序
- 构造函数析构函数调用次序
- 继承和组合构造函数和析构函数的次序
- 构造函数与析构函数的调用次序
- 有继承关系的构造函数和析构函数的执行次序
- 单继承时的构造函数的调用次序
- 类继承中构造函数和析构函数的调用
- 类继承中构造函数和析构函数的调用
- 类继承中构造函数和析构函数的调用
- 类继承中构造函数和析构函数的调用
- 类继承中构造函数和析构函数的调用
- 类继承中构造函数和析构函数的调用
- 类继承中构造函数和析构函数的调用
- 类继承中构造函数和析构函数的调用
- C++继承中构造函数和析构函数的调用顺序
- elasticsearch配置ik分词器
- UVALA 3263 Audiophobia
- Maven学习总结(六)——Maven与Eclipse整合
- 字幕
- EclipseTomcat内存不足问题解决
- 继承中构造函数和析构函数的调用次序
- mybatis/JDBC读取mysql数据库中CHAR(1)类型数据为空
- Scala IDE for Eclipse 解析代码错误
- d3.js——绘制动态中国地图
- 理解Fragment生命周期
- Java ConcurrentModificationException异常原因和解决方法
- G++ 版本问题
- 开启重力感应
- MySQL 通用查询日志(General Query Log)