C++ 虚析构函数
C++ 函数
2023-09-11 14:17:25 时间
C++类里面,我们经常可以看到析构函数是虚函数,这个虚函数有什么作用吗?我们可以通过一个很简单的例子来看看虚析构函数的作用。
#include<iostream> using namespace std; class CBase { public: /*virtual*/ ~CBase() { cout << "CBase::~CBase()\n"; } }; class CChild: public CBase { public: virtual ~CChild() { cout << "CChild::~CChild()\n"; } }; int main() { CChild* p = new CChild(); delete p; cout << endl; CBase* p2 = new CChild(); delete p2; return 0; } ~
输出:
CChild::~CChild() CBase::~CBase() CBase::~CBase()
使用虚拟析构函数:
include<iostream> using namespace std; class CBase { public: virtual ~CBase() { cout << "CBase::~CBase()\n"; } }; class CChild: public CBase { public: virtual ~CChild() { cout << "CChild::~CChild()\n"; } }; int main() { CChild* p = new CChild(); delete p; cout << endl; CBase* p2 = new CChild(); delete p2; return 0; }
输出:
include<iostream> using namespace std; class CBase { public: virtual ~CBase() { cout << "CBase::~CBase()\n"; } }; class CChild: public CBase { public: virtual ~CChild() { cout << "CChild::~CChild()\n"; } }; int main() { CChild* p = new CChild(); delete p; cout << endl; CBase* p2 = new CChild(); delete p2; return 0; }
总结:
delete p的时候调用基类还是子类的析构函数呢?其实这个问题很简单,p是CChild指针(子类),那么自然调用子类的析构函数了。基类析构函数会被调用吗?答案是肯定的,其实这个是C++的特性,子类的析构函数会自动调用基类的析构函数。子类析构是这样的过程:
1. 析构子类扩展部分(也就是运行子类析构函数代码);
2. 在子类析构函数返回之前调用基类析构函数来释放基类部分。
这个过程跟析构函数是否是虚函数无关。也就是说:
无论析构函数是否是虚函数,子类的析构函数一定会调用基类的析构函数。顺序是先析构子类部分,再析构基类部分。
(对于构造函数,我们可以在子类的构造函数里面选择调用基类的某一个构造函数,如果不在子类里面显式地调用基类构造函数,那么系统自动会调用基类的默认构造函数。顺序刚好和析构相反,先构造基类部分,再构造子类部分)
对于delete一个指向子类的基类指针(P2):
1. 对于虚析构函数,那么就是基类和子类的析构函数都会被调用,先析构子类部分,再析构基类部分。(基类析构函数是被子类析构函数自动调用的)
2. 对于非虚析构函数,子类析构函数不会被调用,只有基类析构函数才会被调用。
相关文章
- C++11 Lambda表达式(匿名函数)用法详解
- C/C++ DNS 查询IP地址
- C/C++ stat()函数:获取文件状态
- 【侯捷】C++内存管理机制
- 【C++】重载
- 使用C++的函数memset()时要注意它的操作对象是每一个字节
- C++类中成员函数声明后面的const的含义
- C/C++写函数的时候函数名不要用div
- C++第12周项目2——分段函数
- C++ 函数
- 【C/C++知识点汇总】
- C/C++中string和int相互转换的常用方法
- 《C和C++程序员面试秘笈》——1.10 标准头文件的结构
- 《C++ Templates中文版》——第2章 函数模板
- C++ 虚函数表解析_转载于陈皓
- 基于QT(C++)实现(图形界面)校园导览系统【100010183】
- c++中inline函数的意义
- C++进阶之虚函数表
- C++编程——函数模板
- android使用C/C++调用SO库
- C++ ------ 虚函数覆盖、重载
- 堆(stack) 之 c 和 c++模板实现(空类默认成员函数 初谈引用 内联函数)
- C++ 虚函数表解析
- C++ 函数的使用
- C++实操 - 函数无参数的表示方法
- C++11实现argsort功能
- c++ inline内联函数