C++【子类的构造和析构】
2015-06-15 10:11
477 查看
子类的构造和析构
1.如果在子类的构造函数的初始化表中没有显式地指明基类部分如何初始化,那么系统就以以无参的方式初始化子类对象中的基类子对象,前提是基类类型支持无参构造。否则,就根据所指定的构造函数和参数对基类部分进行初始化。
2.构造和析构顺序
构造:基类->成员->子类
析构:子类->成员->基类
如果有多个成员,则按照其在类中被声明的顺序依次构造,如果有多个基类,则按照继承表的顺序依次构造,析构的顺序与构造严格相反。
3.子类的析构函数(无论自定义还是缺省),都会自动调用基类的析构函数,但是基类的析构函数不会调用子类的析构函数。因此,delete一个指向子类对象的基类指针,将可能引发内存泄漏。
4.基类的析构不会调用子类的析构。
示例代码:
1.如果在子类的构造函数的初始化表中没有显式地指明基类部分如何初始化,那么系统就以以无参的方式初始化子类对象中的基类子对象,前提是基类类型支持无参构造。否则,就根据所指定的构造函数和参数对基类部分进行初始化。
2.构造和析构顺序
构造:基类->成员->子类
析构:子类->成员->基类
如果有多个成员,则按照其在类中被声明的顺序依次构造,如果有多个基类,则按照继承表的顺序依次构造,析构的顺序与构造严格相反。
3.子类的析构函数(无论自定义还是缺省),都会自动调用基类的析构函数,但是基类的析构函数不会调用子类的析构函数。因此,delete一个指向子类对象的基类指针,将可能引发内存泄漏。
4.基类的析构不会调用子类的析构。
示例代码:
#include <iostream> using namespace std; class A { public: A (void) { cout << "A构造" << endl; } ~A (void) { cout << "A析构" << endl; } }; class B { public: B (void) { cout << "B构造" << endl; } ~B (void) { cout << "B析构" << endl; } }; class C : public A { public: C (void) { cout << "C构造" << endl; } ~C (void) { cout << "C析构" << endl; } private: B m_b; }; int main (void) { // C c; A* p = new C;//指向基类的指针p,基类的析构函数不会调用子类的析构函数 delete p;//delete一个指向子类对象的基类指针,将可能引发内存泄漏 return 0; } 输出结果: A构造 B构造 C构造 A析构
相关文章推荐
- [C/C++]_[初级]_[malloc-calloc-new的区别]
- [C/C++]_[初级]_[malloc-calloc-new的区别]
- C++ 继承和虚基类 初探
- C语言实现清空指定文件夹中所有文件的方法
- 为什么C++有函数重载
- C++实现显示MP3文件信息的方法
- c++学习整理
- 快速排序,c++ 模板技术表述,完全兼容标准库!!!
- tinyxml非常好的实例 --c++解析XML
- 大话设计模式C++版——工厂模式在COM中的典型应用
- 大话设计模式C++版——工厂模式在COM中的典型应用
- c++ string 和 stl算法
- Convert a String In C++ To Upper or Lower Case
- 插入排序算法,c++ 模板技术表述,完全兼容标准库容器!!!
- [c++]字符串类各种操作的实现以及遇到的bug
- c++ 封装库 给c# 调用
- 浅谈C语言C++中可变参数问题!!!
- C++ Circle类
- C++ 64位自定义随机数生成器的使用 <random> 参照C++11
- 经典C语言程序编码-利润计算