`
isiqi
  • 浏览: 16069444 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

为什么定义类的时候,一定要让它的析构函数为虚的?

阅读更多

其实这是effect c++的一个准则,无奈呆傻蠢笨,老是忘记,隧写下以铭记。

一:

class A
{
public:
~A()
{
cout << __FUNCTION__ << endl;
}
};

class B : public A
{
public:
~B()
{
cout << __FUNCTION__ << endl;
}
};

int _tmain(int argc, _TCHAR* argv[])
{
A* p = new B; //如此,当p被释放时,由于它是A类型的,所以只会被调用A的析构函数

delete p;

return 0;
}

所以问题的关键:当有子类继承自这个父类,而这个父类又没有使用虚的析构函数,恰巧此时出现了这样的用法A* p = new B; 当p被析构掉时,程序只会调用类A的析构函数,而绝不会想到调用类B的。

二:

class A
{
public:
virtual ~A()
{
cout << __FUNCTION__ << endl;
}
};

class B : public A
{
public:
virtual ~B()
{
cout << __FUNCTION__ << endl; //奇迹发生了,子类在调用完自己的析构函数后,会继续自动调用父类的析构函数
}
};

int _tmain(int argc, _TCHAR* argv[])
{
A* p = new B;

delete p;

return 0;
}

当A的析构函数被申明为虚的以后,其子类的析构函数会将其重载,即使在 A* p = new B;这样的情况下,这样就不会发生没有调用子类析构函数的情况了。

注意:

利用了 子类在调用完自己的析构函数后,会继续自动调用父类的析构函数


分享到:
评论

相关推荐

    C++中析构函数定义成虚函数的原因.doc

    C++中析构函数定义成虚函数的原因 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/SearchLife/archive/2009/03/12/3985341.aspx

    析构函数的作用 什么是析构函数

    3、一个类中至多有一个析构函数,如果程序员没有定义析构函数,那么系统会自动地加入一个析构函数。 4、不能显式地调用析构函数,而是由系统自动调用。 定义析构函数格式为: ~类名() {…}  由于c#得到自动...

    抽象类与虚函数的应用

    将析构函数声明为虚函数。 (2)定义两个类Cat、Dog,都继承自Animal,并重载Identify函数,显示动物的种类及名字。 (3)定义一个Tiger类,继承自Cat,重载Identify函数,显示动物的种类和名字。 (4)定义一个...

    marstau#marstau.github.io#2014-09-04-纯虚析构函数必须定义1

    但这里还有一件事:必须提供纯虚析构函数的定义:awov::\~awov() {} // 纯虚析构函数的定义这个定义是必需的,因为虚析构函数工作的方式是:最底层的

    类的继承与派生实验

    2:正确定义派生类的构造函数与析构函数,理解定义一个派生类对象时构造函数、析构函数的调用次序。 3:理解同名冲突的产生原因,会使用虚基类来解决第三类同名冲突问题,并理解引入虚基类后构造函数、析构函数的...

    是谁在叫c++运行程序.exe

    Cat包含构造函数、析构函数和虚函数sound Leopard包含构造函数、析构函数和虚函数sound 要求:定义一个Felid类指针,采用动态内存分配的方式建议一个Cat对象,并且调用sound函数,之后撤销该对象,采用动态内存...

    C++的概念/解释,可打印,华南师范大学C++考过。

    59. 为什么要定义虚析构函数? 13 60. 试说明派生类对象的构造和析构次序。 13 61. 试说明虚函数和纯虚函数有什么区别 13 62. 基类指针可以指向派生类的对象, 为什么派生类的指针不能指向基类对象? 13 63. 如果一...

    C++ 课程作业 继承与派生 (motorcycle类设计(虚基类))

    声名一个基类vehicle,有私有成员maxspeed和weight,公有成员run...注意:构造函数和析构函数中均为cout语句,说明哪个构造/析构函数被调用。 该题重点和难点在于构造函数的设计,需考虑怎么给基类及最远基类传递参数。

    C++中虚函数和纯虚函数定义

     一个成员函数被声明为虚函数后,在同一类族中的类不能再定义一个非virtual的但与该虚函数具有相同的参数(包括个数和类型)和函数返回值类型的同名函数。  根据什么考虑是否把一个成员函数声明为虚函数?  ①...

    EmployeeManger.cpp

    (1)在技术人员类Worker、销售人员类Saler和经理...成员函数包括:构造函数、析构函数,增加、查询、 修改、删除、显示员工的函数,以及计算所有员工工资和奖金的函数。数据成员包括:对象数组及各类员 工的实际人数。

    VC学习文档 当对两个值做比较的时候,将常量放在前面,如果逻辑错误的话,编译时就会出错,例如:

    子类继承父类以后,当子类创建对象时先调用父类的构造函数再调用子类的构造函数,删除对象时先调用子类的析构函数再调用父类的析构函数。 关于函数的覆盖和虚函数的解释可以参考工程中的Main实例 当父类中某函数被...

    cpp.rar_cpp定义_mirrorqfu_show

    定义虚的析构函数; 重载比较操作符:==、&gt;和&lt;,用于比较两个形状面积的大小关系,返回值类型为bool,可以定义为成员函数或友元函数。 (2)从形状类Shape派生矩形类Rectangle: 添加double型的保护数据...

    EmployeeManger_职工信息管理系统_

    (1)在技术人员类Worker、销售人员类Saler和经理类Manager中计算奖金的成员函数,在类具有不同的实现方式,定义为虚函数;员工类Employee中,计算奖金的成员函数没有具体的意义,定义为纯虚函数,员工类变为抽象类...

    点、线、圆、矩形、抛物线的类定义

    定义类,设计私有成员、公有成员、保护成员、虚有成员函数等; 定义构造函数(止少两种重载)、析构函数,定义成员函数,可以获得几何图形的特征点、特征线等参数;考虑数据的安全性等。

    西北农林科技大学C++实验题及代码

    定义虚的析构函数; 重载比较操作符:==、&gt;和&lt;,用于比较两个形状面积的大小关系,返回值类型为bool,可以定义为成员函数或友元函数。 、、、、、、 2、虚函数 利用虚函数实现多态: (1)设计Person类,要求具有...

    50家著名公司笔试题

    华为笔试题 ...请讲一讲析构函数和虚函数的用法和作用。 6.全局变量和局部变量有什么区别?是怎么实现的?操作系统和编译器是怎么知道 的 ? 7.8086是多少位的系统?在数据总线上是怎么实现的?

    华为经典笔试题华为笔试题

    华为笔试题 ...请讲一讲析构函数和虚函数的用法和作用。  6.全局变量和局部变量有什么区别?是怎么实现的?操作系统和编译器是怎么知道的?  7.8086是多少位的系统?在数据总线上是怎么实现的?

    TechCPP:【C ++面试&C ++学习指南】这里整理了C ++精确研发工程师面试和工作必备的知识点

    父类的析构函数为什么要定义为虚函数? 内联函数,构造函数,静态成员函数可以是虚函数吗? 构造函数中可以调用虚函数吗? 为什么需要虚继承?虚继承实现原理解析, C ++内存分配机制 指针 迭代器与普通指针有什么...

    程序员必备知识点整理包括编程、面试、刷题等

    13)C++析构函数为什么要为虚函数15)数组操作中对于指针的深入理解 16)、锁的理解 17) C++11 并发与多线程 18)binder通信 19)LInux 1.12 C++ 基础必备: 1)内联函数和宏定义的区别?(*****) 2)sizeof size ...

    用c++实现一个抽象类DataStucture

    3) 虚析构函数~DataStructure() 4) 纯虚函数Output(),输出DataStructure中的数据 5) 纯虚函数Size(),返回DataStructure中的元素个数 2. 请创建DataStructure的一个派生类MyString,该类包括下面的成员变量和...

Global site tag (gtag.js) - Google Analytics