代码一、

#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++的内存布局,虚函数是由放在虚函数表中的函数指针指向的,由函数指针间接调用的。而且派生类中如果定义了虚函数,那么虚函数表中相应存放指向基类虚函数的指针就会被指向派生类虚函数的指针替换。以此实现多态,即用基类指针调用派生类函数。

但是析构函数是特殊呢,因为派生类的析构函数和基类的析构函数并不重名,因此可能不是这样处理的,此处还需要深究。

最新文章

  1. Ubuntu菜鸟入门(六)—— 有道词典安装
  2. 【Avalon】获取隐藏元素的尺寸
  3. poj 1191 棋盘分割(dp + 记忆化搜索)
  4. 应用XML作为数据库的快速开发框架
  5. Android开发之通过Intent启动系统应用的协议
  6. 洛谷 P1052 过河
  7. ASP.NET 日志
  8. 百度富文本编辑器UEditor1.3上传图片附件等
  9. jQuery addClass removeClass toggleClass hasClass is(.class)用法
  10. 牛客小白月赛12 J 月月查华华的手机(序列自动机)
  11. Linux操作系统中打开文件数量的查看方法
  12. Python 成仙之路
  13. 使用DOM的方法获取所有li元素,然后使用jQuery()构造函数把它封装为jQuery对象
  14. 使用Narrator读取RichTextBlock内容
  15. [置顶] app后端设计--总目录
  16. HTML第二课——css
  17. selenium自动化测试通过localstorage绕过登陆
  18. 判断是否是微信浏览器JavaScript代码
  19. 存储结构简明分析——DAS、NAS和SAN
  20. Varint数值压缩算法

热门文章

  1. IE8 通过Jquery动态修改html不显示的问题
  2. Oracle 乱码或则中文无法正确查询问题
  3. 【Android UI】使用RelativeLayout与TableLayout实现登录界面
  4. C# 实现将 PDF 转文本的功能
  5. git/github运用
  6. Linux Samba安装与使用
  7. tomcat支持中文文件名下载
  8. MSCRM 2011 JavaScript 开发文档
  9. 算法笔记_136:交替字符串(Java)
  10. npm run build:h5 报错