C++之虚析构函数
代码一、
#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++的内存布局,虚函数是由放在虚函数表中的函数指针指向的,由函数指针间接调用的。而且派生类中如果定义了虚函数,那么虚函数表中相应存放指向基类虚函数的指针就会被指向派生类虚函数的指针替换。以此实现多态,即用基类指针调用派生类函数。
但是析构函数是特殊呢,因为派生类的析构函数和基类的析构函数并不重名,因此可能不是这样处理的,此处还需要深究。
C++之虚析构函数的更多相关文章
- c++虚析构函数
虚析构函数的作用主要是当通过基类指针删除派生类对象时,调用派生类的析构函数(如果没有将不会调用派生类析构函数) #include <iostream> using namespace st ...
- EC笔记,第二部分:7.为多态基类声明虚析构函数
7.为多态基类声明虚析构函数 1.为多态基类声明虚析构函数 code1: class A{ public: int* a; A():a(new int(5)) {} ~A(){ delete a; } ...
- C++浅析——继承类内存分布和虚析构函数
继承类研究 1. Code 1.1 Cbase, CTEST为基类,CTest2为其继承类,并重新申明了基类中的同名变量 class CBase { public: int Data; CBase() ...
- 虚析构函数(√)、纯虚析构函数(√)、虚构造函数(X)
from:http://blog.csdn.net/fisher_jiang/article/details/2477577 一. 虚析构函数 我们知道,为了能够正确的调用对象的析构函数,一般要求具有 ...
- C++学习24 虚析构函数
在C++中,构造函数用于在创建对象时进行初始化工作,不能声明为虚函数.因为在执行构造函数前对象尚未创建完成,虚函数表尚不存在,也没有指向虚函数表的指针,所以此时无法查询虚函数表,也就不知道要调用哪一个 ...
- 从零开始学C++之虚函数与多态(一):虚函数表指针、虚析构函数、object slicing与虚函数
一.多态 多态性是面向对象程序设计的重要特征之一. 多态性是指发出同样的消息被不同类型的对象接收时有可能导致完全不同的行为. 多态的实现: 函数重载 运算符重载 模板 虚函数 (1).静态绑定与动态绑 ...
- 从零开始学C++之虚函数与多态(二):纯虚函数、抽象类、虚析构函数
一.纯虚函数 虚函数是实现多态性的前提 需要在基类中定义共同的接口 接口要定义为虚函数 如果基类的接口没办法实现怎么办? 如形状类Shape 解决方法 将这些接口定义为纯虚函数 在基类中不能给出有意义 ...
- C/C++中的虚析构函数和私有析构函数的使用
代码: #include <iostream> using namespace std; class A{ public: A(){ cout<<"construct ...
- C++中基类的析构函数为什么要用virtual虚析构函数
知识背景 要弄明白这个问题,首先要了解下C++中的动态绑定. 关于动态绑定的讲解,请参阅: C++中的动态类型与动态绑定.虚函数.多态实现 正题 直接的讲,C++中基类采用virtual虚析构函数是 ...
- c++ 虚析构函数[避免内存泄漏]
c++ 虚析构函数: 虚析构函数(1)虚析构函数即:定义声明析构函数前加virtual 修饰, 如果将基类的析构函数声明为虚析构函数时,由该基类所派生的所有派生类的析构函数也都自动成为虚析构函数. ...
随机推荐
- calibre,完成对各种格式的电子书籍的管理和格式转换及同步
Calibre是免费的电子书制作.阅读软件,源代码开放,拥有跨平台的设计,支持多个基于不同系统的便携式移动设备,包括苹果iPhone.Amazon电子书等设备.它是一个完整的电子图书馆,包括图书馆管理 ...
- 使用Proxmark3进行MIFARE Classic卡的安全测试
使用Proxmark3进行MIFARE Classic卡的安全测试 Proxmark3的MIFARE安全测试是很多朋友都非常重视的一部分,所以我们特地以这个部分进行介绍,告诉大家如何当你完成前期操 ...
- UIWebView页面的控制(二)
1.UIWebView的内容控制的属性/方法列表 loading属性 确认当前页面是否在读入中 canGoForward属性 确认goForward 方法是否可运行, ...
- linux下vim命令具体解释
很具体的介绍linux中vim的操作命令. 高级一些的编辑器,都会包括宏功能,vim当然不能缺少了.在vim中使用宏是很方便的: :qx 開始记录宏.并将结果存入寄存器x q 退出记录 ...
- 数据挖掘学习指引<一>
对于当前热门的大数据.云计算等技术,被百度.阿里等国内互联网巨头炒的非常火,数据挖掘作为一门非常有用的技术,在商业管理.市场分析.科学计算等大数据方面发挥着大作用. 数据挖掘技术也变得非常火,why? ...
- Java之JVM调优案例分析与实战(5) - 服务器JVM进程奔溃
环境:一个基于B/S的MIS系统,硬件为2个CPU.8GB内存的HP系统,服务器是WebLogic9.2(就是第二个案例中的那个系统).正常运行一段时间后,最近发现在运行期间频繁出现集群节点的虚拟机进 ...
- 21-spring学习-springMVC实现CRUD
结合业务层实现一共完成CRUD操作 1,定义一共IMessageServese接口 package com.SpringMVC.Service; import java.util.Map; impor ...
- 【Espruino】NO.17 使用平板电脑调试Espruino(OTG方式)
http://blog.csdn.net/qwert1213131/article/details/38068379 本文属于个人理解,能力有限,纰漏在所难免,还望指正! [小鱼有点电] [Espru ...
- 【TP5.0】页面布局,引入公共的模版文件
1.实例:如后台admin模块,公用一个header.html和footer.hml 2.模块结构: 3.使用方式: {include file="common/header"} ...
- Android SDK 快速安装方法
我们都知道使用Android sdk manager下载安装sdk速度非常慢,一般在10k/s以内,本文章推荐一种能够借助迅雷等下载工具下载sdk的zip包从而快速安装sdk的方法. 1.下载3个xm ...