C++之虚析构函数
2024-09-04 02:13:10
代码一、
#include <iostream>
using namespace std; class Base
{
public:
Base(){};
~Base()
{
cout << "Base destructor." << endl;
};
}; class Derive : public Base
{
public:
Derive(){};
~Derive()
{
cout << "Derive destructor." << endl;
};
}; int main(int argc, char **argv)
{
cout << "delete pBase" << endl;
Base *pBase = new Derive();
delete pBase; cout << "delete pDerive" << endl;
Derive *pDerive = new Derive();
delete pDerive;
return ;
}
运行结果:
代码二、
#include <iostream>
using namespace std; class Base
{
public:
Base(){};
virtual ~Base()
{
cout << "Base destructor." << endl;
};
}; class Derive : public Base
{
public:
Derive(){};
~Derive()
{
cout << "Derive destructor." << endl;
};
}; int main(int argc, char **argv)
{
cout << "delete pBase" << endl;
Base *pBase = new Derive();
delete pBase; cout << "delete pDerive" << endl;
Derive *pDerive = new Derive();
delete pDerive;
return ;
}
运行结果:
结论:
基类的析构函数是为了,删除指向派生类对象的基类指针时,会调用派生类的析构函数。
只要派生类析构函数被调用,之后必定调用基类的析构函数。
疑问:按照C++的内存布局,虚函数是由放在虚函数表中的函数指针指向的,由函数指针间接调用的。而且派生类中如果定义了虚函数,那么虚函数表中相应存放指向基类虚函数的指针就会被指向派生类虚函数的指针替换。以此实现多态,即用基类指针调用派生类函数。
但是析构函数是特殊呢,因为派生类的析构函数和基类的析构函数并不重名,因此可能不是这样处理的,此处还需要深究。
最新文章
- Ubuntu菜鸟入门(六)—— 有道词典安装
- 【Avalon】获取隐藏元素的尺寸
- poj 1191 棋盘分割(dp + 记忆化搜索)
- 应用XML作为数据库的快速开发框架
- Android开发之通过Intent启动系统应用的协议
- 洛谷 P1052 过河
- ASP.NET 日志
- 百度富文本编辑器UEditor1.3上传图片附件等
- jQuery addClass removeClass toggleClass hasClass is(.class)用法
- 牛客小白月赛12 J	月月查华华的手机(序列自动机)
- Linux操作系统中打开文件数量的查看方法
- Python 成仙之路
- 使用DOM的方法获取所有li元素,然后使用jQuery()构造函数把它封装为jQuery对象
- 使用Narrator读取RichTextBlock内容
- [置顶] app后端设计--总目录
- HTML第二课——css
- selenium自动化测试通过localstorage绕过登陆
- 判断是否是微信浏览器JavaScript代码
- 存储结构简明分析——DAS、NAS和SAN
- Varint数值压缩算法