四种情况:
1. 创建一个类指针时,调用其构造函数;删除当前指针时,自动调用其析构函数。
2. 创建子类对象指针时,首先调用其父类的构造函数,然后调用子类的构造函数;删除当前指针时先调用子类的析构函数,然后调用父类的析构函数。
3. 一个父类指针指向子类地址时,创建指针时先调用父类的构造函数,然后调用子类的构造函数;删除当前指针时,只调用父类的析构函数。
4. 在第三种情况中,为了在删除指针时,也调用子类的析构函数,则需要将父类的析构函数声明为抽象的。
给出具体的代码实践结果:
#include <iostream>
using namespace std; //四种情况:
//1. 创建一个类指针时,调用其构造函数;删除当前指针时,自动调用其析构函数
//2. 创建子类对象指针时,首先调用其父类的构造函数,然后调用子类的构造函数;删除当前
// 指针时,先调用子类的析构函数,然后调用父类的析构函数
//3. 一个父类指针指向子类地址时,创建指针时先调用父类的构造函数,然后调用子类的构造函数;
// 删除当前指针时,只调用父类的析构函数
//4. 在第三种情况中,为了在删除指针时,也调用子类的析构函数,则需要将父类的析构函数声明为
// 抽象的 #define SAFE_DELETE(p) {delete (p);(p) = NULL;} class Person
{
public:
Person(){
cout<<"Person 构造函数"<<endl;
}
virtual ~Person(){
cout<<"Person 析构函数"<<endl;
} }; class Son : public Person
{
public:
Son(){
cout<<"Son 构造函数"<<endl;
}
~Son(){
cout<<"Son 析构函数"<<endl;
} }; int main(int argc, char const *argv[])
{
Person *mPerson = new Person();
SAFE_DELETE(mPerson); cout<<endl<<endl; Son *mSon = new Son();
SAFE_DELETE(mSon); cout<<endl<<endl; Person *mPerson2 = new Son();
SAFE_DELETE(mPerson2); return ;
}
结果:
Person 构造函数
Person 析构函数 Person 构造函数
Son 构造函数
Son 析构函数
Person 析构函数 Person 构造函数
Son 构造函数
Son 析构函数
Person 析构函数
C++构造函数和析构函数执行顺序的更多相关文章
-
C++-理解构造函数、析构函数执行顺序
先初始化序列中的函数调用,如果基类构造函数为非引用传递,则引起参数的拷贝构造 再: 先类内的成员构造函数(拷贝/默认),再类的构造函数:先基类,再派生类: 本文主要说明对象创建时构造函数的执行顺序,对 ...
-
c++派生类中构造函数和析构函数执行顺序、判断对象类型、抽象类、虚函数
一. 代码: 1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 #include&l ...
-
由阿里巴巴一道笔试题看Java静态代码块、静态函数、动态代码块、构造函数等的执行顺序
一.阿里巴巴笔试题: public class Test { public static int k = 0; public static Test t1 = new Test("t1&qu ...
-
构造代码块、构造函数、this执行顺序
一.构造函数 对象一建立就会调用与之对应的构造函数. 构造函数的作用:可以用于给对象进行初始化. 构造函数的小细节:当一个类中没有定义构造函数时,系统会默认给该类加一个空参数的构造函数:当在类中自定义 ...
-
关于构造函数及参数执行顺序说明(c#)
原文:https://blog.csdn.net/junmail/article/details/83249186 构造函数的执行顺序: 子类静态变量>子类静态构造函数>子类非静态变量&g ...
-
laravel构造函数和中间件执行顺序问题
今天想重构下代码结构: BaseController.php 放置公共的中间件 class BaseController { public function __construct(){ $this- ...
-
C++类继承中的构造函数和析构函数 调用顺序
思想: 在C++的类继承中,构造函数不能被继承(C11中可以被继承,但仅仅是写起来方便,不是真正的继承) 建立对象时,首先调用基类的构造函数,然后在调用下一个派生类的构造函数,依次类推: 析构对象时, ...
-
C# 静态构造函数,静态变量执行顺序(升华版)
上篇 是基本语法基础下的执行顺序,包括继承这个维度下的执行顺序,我们可以依照的规律顺下来,下面我们看下一些摸不到头脑的情况 我们实验 一个 类中的方法 去调用另一个非继承类的情况, 我们主要看下 ...
-
C++中的构造函数和析构函数
构造函数: 在类实例化对象时自动执行,对类中的数据进行初始化.构造函数可以从载,可以有多个,但是只能有一个缺省构造函数. 析构函数: 在撤销对象占用的内存之前,进行一些操作的函数.析构函数不能被重载, ...
随机推荐
-
mybatis.net 多表联查
mybatis.net针对多表联查,其实不用讲联查出的所有的列全部做一个新的resultMap,我们完全可以通过集成关系来实现,真是上一次说的懒加载,在一定程度上可以提高其性能,但这并不是说懒加载性能 ...
-
Unity(64bit)5.1 打开无故出现框框,纹理不见了
Unity(64bit)5.1打开无故出现框框,纹理不见了 原来是脚本有误影响了,U3D编辑器打开那一刹那出错
-
Doccms 中新闻列表排序无效bug的修复
手动修改 content/index/list.php 37 为 $sql="Select * FROM ".TB_PREFIX."list Where channelI ...
-
DSP using Matlab 示例Example2.2
a. n = -2:10; x = [1:7,6:-1:1]; % generate x(n) [x11,n11] = sigshift(x,n,5); [x12,n12] = sigshift(x, ...
-
调试工具GDB详解
1 简介 2 生成调试信息 3 启动GDB 的方法 4 程序运行上下文 4.1 程序运行参数 4.2 工作目录 4.3 程序的输入输出 5 设置断点 5.1 简单断点 5.2 多文件设置断点 5.3 ...
-
spark on mesos 两种运行模式
spark on mesos 有粗粒度(coarse-grained)和细粒度(fine-grained)两种运行模式,细粒度模式在spark2.0后开始弃用. 细粒度模式 优点 spark默认运行的 ...
-
OC中的消息传递和初始化
[receiver message]:[接收者 消息] 把消息传递给接收者. getter(接收器),setter(设置器):只设置和读取一个参数. Person *p1 = [[Person all ...
-
第二周02:Fusion ICP逐帧融合
本周主要任务02:Fusion 使用ICP进行逐帧融合 任务时间: 2014年9月8日-2014年9月14日 任务完成情况: 已实现将各帧融合到统一的第一帧所定义的摄像机坐标系下,但是由于部分帧之间的 ...
-
【转】linux下cvs配置
1. 验证是否已安装CVS #rpm -q cvs 如果能显示出类似这样的版本信息,证明已安装CVS: #cvs-1.11.19 若没有安装信息,则需要从htttp://www.cvshome.or ...
-
js获取文本的行数
<div class="txt" style="line-height:30px">我是文字<br>我是文字<br>我是文字 ...