博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
复合&继承关系下的构造和析构
阅读量:4184 次
发布时间:2019-05-26

本文共 2997 字,大约阅读时间需要 9 分钟。

继承关系下的构造和析构

看一下测试代码:

/* * @filename:    Inheritance.cpp * @author:      Tanswer * @date:        2018年01月31日 14:59:28 * @description: 测试继承关系下的构造和析构 */#include
using namespace std;class Base{ public: Base(){ cout << "Base ctor ..." << endl; } virtual ~Base(){ cout << "Base dtor ..." << endl; }};class Derived:public Base{ public: Derived(){ cout << "Derived ctor ..." << endl; } ~Derived(){ cout << "Derived dtor ..." << endl; }};int main(){ Derived test; return 0;}

代码描述了这样一种关系,如下:

这里写图片描述

继承表现为 is-a 的关系,举个例子人是哺乳动物,那么人具有哺乳动物的特征,所以将 Base 放在里面。

运行结果如下:

这里写图片描述

  1. 构造由内而外

    Derived 的构造函数首先调用 Base 的 default 构造函数,然后才执行自己的。
    代码类似这样:Derived::Derived(…): Base() { … }; 这是编译器加的,我们声明一个子类时不需要管。

  2. 析构由外而内

    Derived 的析构函数首先执行自己,然后才调用 Base 的析构函数。
    代码类似这样:Derived::~Derived(…) { … ~Base() }; 同上。

复合关系下的构造和析构

看一下测试代码:

/* * @filename:    Composition.cpp * @author:      Tanswer * @date:        2018年01月31日 15:06:21 * @description: 测试复合关系下的构造和析构 */#include
using namespace std;class Component{ public: Component(){ cout << "Component ctor ..." << endl; } ~Component(){ cout << "Component dtor ..." << endl; }};class Container{ public: Container(){ cout << "Container ctor ..." << endl; } ~Container(){ cout << "Container dtor ..." << endl; } Component c;};int main(){ Container test; return 0;}

复合表现为 has-a 的关系,如下:

这里写图片描述

运行结果如下:

这里写图片描述

  1. 构造由内而外

    Container 的构造函数首先调用 Component 的 default 构造函数,然后才执行自己的。
    代码类似这样:Container::Container(…): Component() { … };

  2. 析构由外而内

    Container 的析构函数首先执行自己,然后才调用 Component 的析构函数。
    代码类似这样:Container::~Container(…) { … ~Component() }; 同上。

继承和复合关系下的构造和析构

那么既有继承,又有复合呢?构造和析构顺序是什么样呢?

测试代码如下:

/* * @filename:    Inheritance.cpp * @author:      Tanswer * @date:        2018年01月31日 14:59:28 * @description: 测试继承复合关系下的构造和析构 */#include
using namespace std;class Component{ public: Component(){ cout << "Component ctor ..." << endl; } ~Component(){ cout << "Component dtor ..." << endl; }};class Base{ public: Base(){ cout << "Base ctor ..." << endl; } virtual ~Base(){ cout << "Base dtor ..." << endl; } int n;};class Derived:public Base{ public: Derived(){ cout << "Derived ctor ..." << endl; } ~Derived(){ cout << "Derived dtor ..." << endl; } Component c;};int main(){ Derived test; return 0;}

按照前面两种情况下的讨论,可以得到它们的关系如下:

这里写图片描述

问题在于里面部分的次序,谁先谁后,在我目前的环境下,运行结果如下:

这里写图片描述

也就是:

  1. 构造由内而外

    Derived 的构造函数首先调用 Base 的 default 构造函数,然后调用 Component 的 default 构造函数,然后才执行自己的。
    代码类似这样:Derived::Derived(…): Base() , Component() { … };

  2. 析构由外而内

    Derived 的析构函数首先执行自己,然后调用 Component 的析构函数,然后调用 Base 的析构函数。
    代码类似这样:Derived::~Derived(…) { … ~Component(), ~Base() }; 。

有疑问的可以自己测试一下,在析构和构造函数里打印点文字,来验证一下。其实也很好想,构造时从里面一层一层往外构造,拆除时肯定要从外面开始,一层一层的拆掉。

你可能感兴趣的文章
fflush(stdin)在gcc编译器中不起作用?
查看>>
《Android系统学习》第九章:Android模拟器编译
查看>>
《Android系统学习》第十章:Android消息处理、消息循环和消息队列
查看>>
《Android系统学习》第十一章:Android应用程序Activity组件分析
查看>>
Android4.2 Input子系统
查看>>
《C++面向对象》结构体继承
查看>>
《tiny6410裸机程序》第二章:LED跑马灯RVDS精简main.c说明
查看>>
指向指针的指针
查看>>
《tiny6410裸机程序》第三章:基础汇编test1
查看>>
《tiny6410裸机程序》第四章:汇编与C混合编程
查看>>
《tiny6410裸机程序》第五章:汇编与C混合编程-LED跑马灯最终说明、myled再次精简
查看>>
《tiny6410裸机程序》第六章:myled通过usb下载至nandflash不能运行
查看>>
《tiny6410裸机程序》第七章:S3C6410外部中断简介
查看>>
《tiny6410裸机程序》第八章:S3C6410外部中断控制寄存器
查看>>
《tiny6410裸机程序》第八章:S3C6410总中断控制寄存器
查看>>
《tiny6410裸机程序》第九章:tiny6410按键控制蜂鸣器程序
查看>>
有关free()函数的一个问题
查看>>
《Android系统学习》之bug定位
查看>>
《Linux内核编程》第七章:USB CORE与USB键鼠驱动
查看>>
《Android系统学习》之JAVA与C混合编程——JNI
查看>>