C++类有继承时,析构函数必须为虚函数
C++类有继承时,析构函数必须为虚函数。如果不是虚函数,则使用时可能存在内在泄漏的问题。
假设我们有这样一种继承关系:

如果我们以这种方式创建对象:
SubClass* pObj = new SubClass();
delete pObj;
不管析构函数是否是虚函数(即是否加virtual关键词),delete时基类和子类都会被释放;
如果我们以这种方式创建对象:
- 若析构函数是虚函数(即加上virtual关键词),delete时基类和子类都会被释放;
- 若析构函数不是虚函数(即不加virtual关键词),delete时只释放基类,不释放子类;
测试代码
大家可以自己测试一下,以下是我的测试代码:
#include <string>
#include <iostream> class BaseClass
{
public:
BaseClass()
: m_pValue(NULL)
{
} /*virtual */~BaseClass()
{
delete m_pValue;
m_pValue = NULL;
std::cout << "BaseClass virtual construct." << std::endl;
} void SetValue(int v)
{
if (!m_pValue)
{
m_pValue = new int(v);
}
else
{
*m_pValue = v;
}
} private:
int* m_pValue;
}; class SubClass : public BaseClass
{
public:
SubClass()
: BaseClass()
, m_pstrName(NULL)
{
} /*virtual */~SubClass()
{
delete m_pstrName;
m_pstrName = NULL;
std::cout << "SubClass virtual construct." << std::endl;
} void SetName(const std::string& name)
{
if (!m_pstrName)
{
m_pstrName = new std::string(name);
}
else
{
*m_pstrName = std::string(name);
}
} private:
std::string* m_pstrName;
}; int main()
{
BaseClass* pObj = new SubClass();
pObj->SetValue();
((SubClass*)pObj)->SetName("zhangsan");
delete pObj;
pObj = NULL;
return ;
}原文地址:https://blog.csdn.net/luoweifu/article/details/53780438
C++类有继承时,析构函数必须为虚函数的更多相关文章
- C++箴言:避免构造或析构函数中调用虚函数
如果你已经从另外一种语言如C#或者Java转向了C++,你会觉得,避免在类的构造函数或者析构函数中调用虚函数这一原则有点违背直觉.但是在C++中,违反这个原则会给你带来难以预料的后果和无尽的烦恼. 正 ...
- (C++)浅谈多态基类析构函数声明为虚函数
主要内容: 1.C++类继承中的构造函数和析构函数 2.C++多态性中的静态绑定和动态绑定 3.C++多态性中析构函数声明为虚函数 1.C++类继承中的构造函数和析构函数 在C++的类继承中, 建立对 ...
- C++多态性中基类析构函数声明为虚函数
在用基类指针指向派生类时, 在基类析构函数声明为virtual的时候,delete基类指针,会先调用派生类的析构函数,再调用基类的析构函数. 在基类析构函数没有声明为virtual的时候,delete ...
- 读书笔记 effective c++ Item 9 绝不要在构造函数或者析构函数中调用虚函数
关于构造函数的一个违反直觉的行为 我会以重复标题开始:你不应该在构造或者析构的过程中调用虚函数,因为这些调用的结果会和你想的不一样.如果你同时是一个java或者c#程序员,那么请着重注意这个条款,因为 ...
- 读书笔记 effective c++ Item 36 永远不要重新定义继承而来的非虚函数
1. 为什么不要重新定义继承而来的非虚函数——实际论证 假设我告诉你一个类D public继承类B,在类B中定义了一个public成员函数mf.Mf的参数和返回类型并不重要,所以假设它们都是void. ...
- C++进阶--构造函数和析构函数中的虚函数
//############################################################################ /* 任何时候都不要在构造函数或析构函数中 ...
- 【校招面试 之 C/C++】第10题 C++不在构造函数和析构函数中调用虚函数
1.不要在构造函数中调用虚函数的原因 在概念上,构造函数的工作是为对象进行初始化.在构造函数完成之前,被构造的对象被认为“未完全生成”.当创建某个派生类的对象时,如果在它的基类的构造函数中调用虚函数, ...
- C++中为什么要将析构函数定义成虚函数
构造函数不可以是虚函数的,这个很显然,毕竟虚函数都对应一个虚函数表,虚函数表是存在对象内存空间的,如果构造函数是虚的,就需要一个虚函数表来调用,但是类还没实例化没有内存空间就没有虚函数表,这根本就是个 ...
- C++析构函数定义为虚函数(转载)
转载:http://blog.csdn.net/alane1986/article/details/6902233 析构函数执行时先调用派生类的析构函数,其次才调用基类的析构函数.如果析构函数不是虚函 ...
随机推荐
- c# android 全局捕获未处理异常
[Application] public class MyApp : Application { public MyApp(IntPtr javaReference, JniHandleOwnersh ...
- 第十四章 Java常用类
14.常用类 14.1 字符串相关的类 1课时 14.2 JDK 8之前时间日期API 1课时 14.3 JDK8中新时间日期API 1课时 14.4 JDK8中的Optional类 1课时 14.5 ...
- bootstrap modal 点击头部移动
$(".modal").each(function(){ $(this).draggable({ handle: ".modal-header" // 只能点击 ...
- phpStudy2018 在win7下切换php7不成功解决办法
phpstudy 由2016升级到2018后,在切换版本时,php5.6及以下版本可以正常切换,切换7.0以上的版本时访问页面报 0xc000007b 错误,网上找了很多方法都没能解决,最后发现是没装 ...
- 2.4 Visio2007显示动态对齐网格
- MySQL:System.Data.Entity ,MySqlCommand, MySqlParameter and "LIKE" %
Introduction Using GetSqlStringCommand with a text comparative, with LIKE, in ADO.NET and the MySQLP ...
- docker push到私有仓库
1.登录 docker login http://xxxxx.com 2.登录私有hub创建项目 例如项目叫:abc-dev 2.给镜像打tag docker tag 2e25d8496557 xxx ...
- 黄聪:iOS $299刀企业证书申请的过程以及细节补充
最近申请了iOS的 299刀企业证书,相关过程有些问题,分享出来,以便后来人参考.申请的过程我主要参考了别人以前的文章,链接如下: 1.https://developer.apple.com/cn/s ...
- CentOS 7安装php
我们已经在上一篇里安装上了nginx:现在我们想要php(也许还包括mysql). (CentOS 7里使用mariadb替代了mysql) # yum install mariadb-client ...
- Kong安装教程(v1.0.2)
使用的软件 Unbuntu 虚拟机(有自己的服务器更好) PostgreSQL kong kong-dashboard docker spring boot 安装 PostgreSQL kong 需要 ...