C++:子类与父类构造与析构的调用时机
文章目录
- 一、引言
- 二、代码
一、引言
构造子类对象时,先调用父类构造函数,再调用子类构造函数(构造函数没有虚函数这一说)
析构子类对象时,先调用子类析构函数,再调用父类析构函数(无论父类的析构函数是否为虚函数)
构造子类构造的父类对象时,先调用父类构造对象,再调用子类构造对象(构造函数没有虚函数这一说)
析构子类构造的父类对象时,若父类是虚函数,则先调用子类析构函数,再调用父类析构函数
析构子类构造的父类对象时,若父类不是虚函数,则只调用父类析构函数
二、代码
#include <algorithm>
#include <iostream>
#include <fstream>using namespace std;
fstream fout("test.txt", ios::app);
//A是一个父类 , 析构函数不是虚函数
class A
{public:A(){fout << " A constructor" << endl;}~A(){fout << " A destructor" << endl;}
};//B是A的子类
class B : public A
{public:B(){fout << " B constructor" << endl;}~B(){fout << " B destructor" << endl;}
};//C是一个父类 , 析构函数是虚函数
class C
{public:C(){fout << " C constructor" << endl;}virtual ~C(){fout << " C destructor" << endl;}
};//D是C的子类
class D : public C
{public:D(){fout << " D constructor" << endl;}~D(){fout << " D destructor" << endl;}
};
int main()
{B * b = new B();//先调用父类A的构造方法,然后调用子类B的构造方法delete b;//删除子类,这时候会先调用子类B的析构函数,再调用父类A的析构函数fout << "-----------------------------" << endl << endl;A *a = new B();//用子类B构造一个父类A的对象 先调用父类A的构造方法,然后调用子类B的构造方法delete a;//删除父类,这时候由于A的析构函数不是虚函数,所以直接调用父类A的构造方法,不会调用子类B的构造方法fout << "-----------------------------" << endl << endl;D * d = new D();//先调用父类C的构造方法,然后调用子类D的构造方法delete d;//删除子类,这时候会先调用子类D的析构函数,再调用父类C的析构函数fout << "-----------------------------" << endl << endl;C *c = new D();//同理,先调用父类C的构造方法,然后调用子类D的构造方法delete c;//删除父类,这时候由于C的析构函数是虚函数,所以直接先调用子类D的析构函数,再调用父类C的析构函数system("pause");return 0;
}
运行结果:
参考:
参考1
C++:子类与父类构造与析构的调用时机相关推荐
- 子类构造与析构时,父类构造与析构机制
子类构造与析构时,父类构造与析构机制1 构造子类对象时,先调用父类构造函数,再调用子类构造函数(构造函数没有虚函数这一说法) 析构子类对象时,先调用子类的析构函数,再调用父类析构函数(无论父类的析构函 ...
- 必考题:子类继承父类,初始化以及方法调用顺序
前言: 最近重投简历,一家公司的笔试题,就是子类继承父类,初始化顺序以及方法的调用顺序,很遗憾,我做错了.所以,记录在这里,希望以后不要再错. 程序: // 父类 public class Paren ...
- java子类和父类构造函数_java 子类和父类构造函数关系
在创建子类的对象时,jvm会首先执行父类的构造方法,然后再执行子类的构造方法,如果是多级继承,会先执行最顶级父类的构造方法,然后依次执行各级个子类的构造方法 package com.my.test; ...
- C++父类与子类间构造,析构,拷贝的调用关系
C++父类与子类间构造,析构,拷贝的调用关系 构造 子类的构造在执行它的构造函数前会根据继承表的顺序执行父类的构造函数 默认执行无参构造 #include <iostream> #incl ...
- C++之继承探究(十二):子类的构造、析构和赋值运算符重载
涉及到本文所讲知识点的博文: C++之析构函数探究 C++之常引用和浅拷贝探究 C++之一个函数链的简单例子(分文件实现) C++之Big Three:拷贝构造.拷贝赋值.析构函数探究 C++之操作符 ...
- php构造和析构方法,php5构造函数与析构函数实例
自php5起,有了构造函数与析构函数. 这使得php更富有面向对象的魅力了. 在php4时,构造函数用的是与类同名的函数来进行构造这个动作. 例如: 复制代码 代码示例: /* * myclass.p ...
- C++继承中的构造与析构
文章目录 1 C++继承中的构造 1.1 子类对象初始化父类成员的方式 1.2 子类对象的构造 2 C++继承中的析构 2.1 子类对象的析构 1 C++继承中的构造 1.1 子类对象初始化父类成员的 ...
- C++继承中构造和析构顺序
C++继承中构造和析构顺序 继承中构造和析构顺序 问题:父类和子类的构造和析构顺序是谁先谁后? 示例 继承中构造和析构顺序 子类继承父类后,当创建子类对象,也会调用父类的构造函数 问题:父类和子类的构 ...
- c++继承中的构造和析构
c++继承中的构造和析构 类型兼容性原则 类型兼容规则中所指的替代包括以下情况: 继承中的对象模型 继承中构造和析构 继承中的构造析构调用原则 继承与组合混搭情况下,构造和析构调用原则 继承中的同名成 ...
最新文章
- 实时大数据开发难、运维难、应用难?来,一站解决!
- 【职业规划和代码库设计】
- SAP删除会计科目 OBR2
- linux下软件实施,linux系统未来或应用广泛
- python中判断变量的类型
- C++输入输出流进制转换
- 原创 子网划分的讲解 例题加思路
- NOIP模拟测试23「mine·water·gcd」
- 【语言处理与Python】10.1自然语言理解\10.2命题逻辑
- SQL性能第1篇:关系优化
- 软件设计师12-数据库(范式)
- 小学多媒体计算机室管理计划,多媒体教室管理工作计划5篇
- Linux打包和解包
- 【转发】ext4文件系统
- yml文件和properties文件区别
- 内存单元地址求字节大小的计算方法
- “腾讯再有本事,也要出海讨生活”
- Blue Coat 2.8亿美元收购云安全创业企业Elastica
- python学习一点 快乐一点(2)乱序整数序列两数之和绝对值最小
- NVIDIA GEFORCE 2080 / 2080 SUPER / 2080 Ti + CUDA Toolkit 8.0 深度学习模型加载速度慢