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

在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. p1164 小A点菜 题解——背包初步

    传送门 除去花里胡哨的表层题干,其实可以简化为: 若有m个东西,每取一个要K个代价,问若要求取出数据的代价为n的方案数是多少 其实是01背包的一种变式(反正我就是这么认为的,不对又怎样,打我啊). 我 ...

  2. [转] Ansible 内置变量参考

    Quick reference for Ansible variables [From] https://github.com/lorin/ansible-quickref

  3. 【GIS新探索】GeoHash原理和编解码实现

    1.什么是GeoHash geohash基本原理是将地球理解为一个二维平面,将平面递归分解成更小的子块,每个子块在一定经纬度范围内拥有相同的编码.不好理解,没关系,我来找个图. 就像上面这张图,一个坐 ...

  4. ftpClient.retrieveFileStream导致FTPClient的后面操作失败

    问题代码: FTPFile[] fs = ftpClient.listFiles(); for (FTPFile ff : fs) { if (ff.getName().equals(fileName ...

  5. spring boot快速入门 9: 单元测试

    进行单元测试: service第一种方式: 第一步:在指定service中创建一个方法进行测试 /** * 通过ID查询一个女生的信息 * @param id * @return */ public ...

  6. JDBC处理Transaction

    package com.ayang.jdbc; import java.sql.*; /** * transaction的构成,随便写一句insenrt,一执行executeUpdate(),它自动提 ...

  7. UTF8最好不要带BOM,附许多经典评论

    UTF-8 不需要 BOM,尽管 Unicode 标准允许在 UTF-8 中使用 BOM.所以不含 BOM 的 UTF-8 才是标准形式,在 UTF-8 文件中放置 BOM 主要是微软的习惯(顺便提一 ...

  8. js中in关键字的用法

    1. 在For...In 声明用于对数组或者对象的属性进行循环/迭代操作. 例子:var a = new Array; for(x in a){ console.log(x); } 2. 判断对象是否 ...

  9. WPF INotifyPropertyChanged

    public class OrderModel:INotifyPropertyChanged { public string _oderID; public string OrderID; { get ...

  10. tomcat+nginx+redis集群搭建并解决session共享问题。

    1 集群搭建 https://www.cnblogs.com/yjq520/p/7685941.html 2 session共享 https://blog.csdn.net/tuesdayma/art ...