基类和派生类:构造函数和析构函数的执行顺序

在Visual Studio中,新建控制台工程,构造类如下:

#include<iostream>
using namespace std; class CBase {
public:
CBase() {
cout << "CBase():Constructor" << endl;
}
~CBase() {
cout << "CBase(): Destructor" << endl;
}
}; class CDerive :public CBase {
public:
CDerive() {
cout << "CDerive():Constructor" << endl;
}
~CDerive() {
cout << "CDerive(): Destructor" << endl;
}
};

对应不同的指针进行 delete 操作,结果如下:

(i)

int main(int argc, char* argv[])
{
CBase* p = new CDerive();
delete p;
return 0;
}

运行结果:

S:\ComputerTech\VS2015\Release>Test.exe
CBase():Constructor
CDerive():Constructor
CBase(): Destructor

(ii)

int main(int argc, char* argv[])
{
CDerive* pp = new CDerive();
delete pp;
return 0;
}

运行结果:

S:\ComputerTech\VS2015\Release>Test.exe
CBase():Constructor
CDerive():Constructor
CDerive(): Destructor
CBase(): Destructor

(iii)

int main(int argc, char* argv[])
{
CDerive* pp = new CDerive();
CBase * p = (CBase*)pp;
delete p;
return 0;
}

运行结果:

S:\ComputerTech\VS2015\Release>Test.exe
CBase():Constructor
CDerive():Constructor
CBase(): Destructor

(iv)

int main(int argc, char* argv[])
{
CBase * p = new CDerive();
CDerive * pp = (CDerive*)p;
delete pp;
return 0;
}

运行结果:

S:\ComputerTech\VS2015\Release>Test.exe
CBase():Constructor
CDerive():Constructor
CDerive(): Destructor
CBase(): Destructor

总结:

由上面的实验结果可以看出,当 new CDerive() 时,会先运行基类的构造函数,然后再运行派生类的构造函数;

而当 delete pointer 时,编译器只考虑 pointer 指针本身的类型而不关心 pointer 实际指向的类型,即:若 pointer 为基类指针,则只调用基类的析构函数(不管 pointer 实际指向的是基类还是派生类);若 pointer 是派生类指针,则先调用派生类的析构函数,再调用基类的析构函数,调用顺序与调用构造函数的顺序相反。

C++学习笔记(6)----基类和派生类的构造函数和析构函数的执行顺序的更多相关文章

  1. c++中的类(构造函数,析构函数的执行顺序)

    类对象的初始化顺序 新对象的生成经历初始化阶段(初始化列表显式或者隐式的完成<这部分有点像java里面的初始化块>)——> 构造函数体赋值两个阶段 1,类对象初始化的顺序(对于没有父 ...

  2. C++学习21 基类和派生类的赋值

    在C/C++中,经常会发生数据类型转换,例如整型数据可以赋值给浮点型变量,在赋值之前,先把整型数据转换为浮点型:反过来,浮点型数据也可以赋值给整型变量. 数据类型转换的前提是,编译器知道如何对数据进行 ...

  3. C#可扩展编程之MEF学习笔记(三):导出类的方法和属性

    前面说完了导入和导出的几种方法,如果大家细心的话会注意到前面我们导出的都是类,那么方法和属性能不能导出呢???答案是肯定的,下面就来说下MEF是如何导出方法和属性的. 还是前面的代码,第二篇中已经提供 ...

  4. 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)

    [源码下载] 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成 ...

  5. (转) C++中基类和派生类之间的同名函数的重载问题

    下面有关派生类与基类中存在同名函数 fn: class A { public: void fn() {} void fn(int a) {} }; class B : public A { publi ...

  6. c++中基类与派生类中隐含的this指针的分析

    先不要看结果,看一下你是否真正了解了this指针? #include<iostream> using namespace std; class Parent{ public: int x; ...

  7. 基类和派生类--this

    基类指针在程序运行的时候的确指向的是一个派生类的对象,但指针的类型仍然是基类指针.C++是一种强类型语言,因此不能用基类指针类型的指针直接调用派生类:而且,同一个类可能有多种不同的派生类,因此不知道实 ...

  8. C++:基类与派生类对象之间的赋值兼容关系

    4.5 基类与派生类对象之间的赋值兼容关系 在一定条件下,不同类型的数据之间可以进行类型转换,例如可以将整型数据赋给双精度型变量. 在赋值之前,先把整型数据转换为双精度型数据,然后再把它双精度型变量. ...

  9. C++:基类和派生类

    4.1 派生类的声明 继承实例如下: class Person{ //声明基类Person public: void print() { cout<<"name:"&l ...

随机推荐

  1. L06-Ubuntu系统中部署Vagrant和VirtualBox

    一.前言 1.Vagrant是一个搭建完整的虚拟开发环境的工具~~~更多关于Vagrant理论可查看这篇博文https://www.cnblogs.com/davenkin/p/vagrant-vir ...

  2. mysql误删root用户

    在操作mysql时误删除root用户,如何进行恢复 在安装hive时候误删除root用户,存在的用户没有权限,解决方法如下. 1.首先在/etc/my.cnf文件中 mysqlID下面添加 skip- ...

  3. P2486 [SDOI2011]染色(树剖)区间覆盖+区间的连续段

    https://www.luogu.org/problemnew/show/P2486 值的一看https://www.cnblogs.com/Tony-Double-Sky/p/9283262.ht ...

  4. 2018焦作网络赛 - Poor God Water 一道水题的教训

    本题算是签到题,但由于赛中花费了过多的时间去滴吧格,造成了不必要的浪费以及智商掉线,所以有必要记录一下坑点 题意:方格从1到n,每一格mjl可以选择吃鱼/巧克力/鸡腿,求走到n格时满足 1.每三格不可 ...

  5. Java 8学习之Stream API

    一个Stream表面上看与一个集合很类似,允许你改变和获取数据.但是实际上他与集合是有很大区别的: Stream自己不会存储元素.元素可能被存储在底层的集合中,或者根据需要产生出来. Stream操作 ...

  6. ES6-Async & 异步

    依赖文件地址 :https://github.com/chanceLe/ES6-Basic-Syntax/tree/master/js <!DOCTYPE html> <html&g ...

  7. JavaScript数据结构-5.队列

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. emacs26.1 ppa

    sudo add-apt-repository ppa:kelleyk/emacssudo apt updatesudo apt install emacs26

  9. [中英对照]The sysfs Filesystem | sysfs文件系统

    The sysfs Filesystem | sysfs文件系统 Abstract | 摘要 sysfs is a feature of the Linux 2.6 kernel that allow ...

  10. Win10双网卡不双待攻略

    声明:本文与个人的技术兴趣毫无关系,只是因为有迫不得已的实际需求,才不得不想办法.所谓"艰难困苦,玉汝于成",大概就是这个道理.(PS:标题我没有写错,不是双网卡双待,就是双网卡但 ...