四种情况:
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++构造函数和析构函数执行顺序的更多相关文章

  1. C++-理解构造函数、析构函数执行顺序

    先初始化序列中的函数调用,如果基类构造函数为非引用传递,则引起参数的拷贝构造 再: 先类内的成员构造函数(拷贝/默认),再类的构造函数:先基类,再派生类: 本文主要说明对象创建时构造函数的执行顺序,对 ...

  2. c++派生类中构造函数和析构函数执行顺序、判断对象类型、抽象类、虚函数

    一. 代码: 1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 #include&l ...

  3. 由阿里巴巴一道笔试题看Java静态代码块、静态函数、动态代码块、构造函数等的执行顺序

    一.阿里巴巴笔试题: public class Test { public static int k = 0; public static Test t1 = new Test("t1&qu ...

  4. 构造代码块、构造函数、this执行顺序

    一.构造函数 对象一建立就会调用与之对应的构造函数. 构造函数的作用:可以用于给对象进行初始化. 构造函数的小细节:当一个类中没有定义构造函数时,系统会默认给该类加一个空参数的构造函数:当在类中自定义 ...

  5. 关于构造函数及参数执行顺序说明(c#)

    原文:https://blog.csdn.net/junmail/article/details/83249186 构造函数的执行顺序: 子类静态变量>子类静态构造函数>子类非静态变量&g ...

  6. laravel构造函数和中间件执行顺序问题

    今天想重构下代码结构: BaseController.php 放置公共的中间件 class BaseController { public function __construct(){ $this- ...

  7. C++类继承中的构造函数和析构函数 调用顺序

    思想: 在C++的类继承中,构造函数不能被继承(C11中可以被继承,但仅仅是写起来方便,不是真正的继承) 建立对象时,首先调用基类的构造函数,然后在调用下一个派生类的构造函数,依次类推: 析构对象时, ...

  8. C# 静态构造函数,静态变量执行顺序(升华版)

    上篇 是基本语法基础下的执行顺序,包括继承这个维度下的执行顺序,我们可以依照的规律顺下来,下面我们看下一些摸不到头脑的情况 我们实验 一个 类中的方法 去调用另一个非继承类的情况,  我们主要看下  ...

  9. Java静态变量、静态块、构造块、构造函数、main函数、普通代码块的执行顺序

    测试代码 public class SingleTest { public static String v = "StaticValue"; static { System.out ...

随机推荐

  1. PI Square中文论坛: PI SDK 开发中级篇| PI Square

    注: 为了更好的利用站内资源营造一个更好的中文开发资源空间,本文为转发修正帖,原作者为OSIsoft技术工程师王曦(Xi Wang),原帖地址:PI SDK 中级篇 来源:https://d.gg36 ...

  2. Azure PowerShell (16) 并行开关机Azure ARM VM

    <Windows Azure Platform 系列文章目录> 并行开机脚本: https://github.com/leizhang1984/AzureChinaPowerShell/b ...

  3. Azure SQL Database (26) 使用Query Store对Azure SQL Database监控

    <Windows Azure Platform 系列文章目录> 我们在使用Azure SQL Database的时候,需要对数据库的性能进行监控,这时候就可以有两种方法: 1.第一种方法, ...

  4. 黄聪:HBuilder复制PHP项目后,【转到定位】功能失效

    1.[工具]--[插件安装]--[Aptana php插件]--[选择]--[安装] 2.随便开几个文件,操作一下[编辑]--[整理代码格式]就可以了

  5. IntelliJ IDEA maven springmvc+shiro简单项目

    搭建springmvc简单步骤如:http://www.cnblogs.com/grasp/p/9045242.html,这点就不在描述了. 新建和设置完工程的目录后,结构如下: pom.xml文件内 ...

  6. vue img标签图片加载时 闪烁

    //jsdata(){ return{ img_url: '', } },created(){ //请求数据,并给图片赋值url ajax.get(http_url) .then(res=>{ ...

  7. 【springboot】之常用技术文档

    https://www.ibm.com/developerworks/cn/java/j-lo-spring-boot/index.html

  8. Linux bash笔记

    关于bash脚本,一般开头都加#!/bin/bash,表示以bash来作为脚本解释器:如果不加的话,就会默认当前用户登陆的shell为脚本解释器(很多情况下为sh,sh与bash不同,有可能导致脚本无 ...

  9. C++进阶--处理拷贝赋值运算符中自赋值的情况

    //############################################################################ /* * 处理拷贝赋值运算符=中自赋值的情 ...

  10. spring线程池(同步、异步)

    一.spring异步线程池类图 二.简单介绍 2.1. TaskExecutor---Spring异步线程池的接口类,其实质是java.util.concurrent.Executor 以下是官方已经 ...