c++为什么基类的析构函数需要加上virtual

C++ 基类析构函数为什么要加上 virtual 一、析构函数 析构函数(destructor)是类成员函数一种 函数的三要素:函数名,形参列表,返回值 1、析构函数原型: 1、无返回值 2、必须和类名一样,但要在前加上~ 3、一个类中有且只有一个,不能被重载 2、析构函数作用: 1、如何定义? 如不显式定义,则自动生缺省析构函数 2、何时被调用?当对象消亡时自动被调用 3、有什么作用?它并不是真正意义上删除对象所有内存,而是在删除... 阅读详情

为什么基类的析构函数需要加上virtual?

c++面试基本都会问到的问题,我之前有很多次没答全,主要还是懒,忘记以后,没有手动去敲一下。这里做一个总结,纪念当初面试踩过的一些坑。

先看下面这个简单的栗子;基类析构函数没有加virtual时

#include <iostream>

using namespace std;

class A
{
public:
	A()
	{
		cout << "A()" << endl;
	}
	~A()	//基类析构函数没有加virtual
	{
		cout << "~A()" << endl;
	}
	virtual void func(){
		cout << "hello A" << endl;
	}

private:

};

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

	~B()
	{
		cout << "~B()" << endl;
	}
	void func(){
		cout << "hello B" << endl;
	}

private:

};

int main()
{
	A *a = new A;
	B *b=new B;

	a->func();	//输出hello A

	a = b;
	a->func();	//输出hello B

	delete a;

	return 0;
}

输出:

基类析构函数加上virtual时,输出

加上vritual后,可以看到,派生类的析构函数也被执行了。

由此得出结论,基类析构函数加上virtual的目的,是为了当基类指针指向子类对象后,当释放基类指针时,子类的对象也能被释放,从而避免内存泄漏。

C++中基类的析构函数为什么要用virtual虚析构函数 大家知道,析构函数是为了在对象不被使用之后释放它的资源,虚函数是为了实现多态。那么把析构函数声明为vitual有什么作用呢?直接的讲,C++中基类采用virtual虚析构函数是为了防止内存泄漏。具体地说,如果派生类中申请了内存空间,并在其析构函数中对这些内存空间进行释放。假设基类中采用的是非虚析构函数,当删除基类指针指向的派生类对象时就不会触发动态绑定,因而只会调用基类的析构函数,而不会调用派生... 阅读详情

相关推荐

基类的析构函数不加virtual引起的异常

#include <iostream> using namespace std; class Animal{ public: static int number; virtual void printCount()=0; Animal(){ ++Animal::number; } virtual ~Animal(){ //错误...

江南又一春 672

C++避坑:基类函数有无virtual关键字,差别巨大

如上图所示,有无virtual对于多态特性的实现是非常重要的,test()没有添加virtual关键字,则编译器直接按照类型来调用对应的函数,不会考虑多态特性。testV()由于添加了virtual关键字,则编译器会考虑多态特性,在运行时调用子类的testV()函数。我们都知道子类继承父类,然后父类指针指向子类对象,则父类指针调用的虚函数其实是调用的子类的虚函数。在java语言中,是可以实现的,只要重写了父类函数。在C++中,父类函数前面不加virtual,则无法实现多态特性,直接上代码进行对比。...

qq_23418043的博客 1868

nbiot和2g_浅谈NBIOT

一、什么是NBIOT?1、概念窄带物联网(Narrow Band Internet of Things, NB-IoT),NB-IoT构建于蜂窝网络,只消耗大约180KHz的带宽,使用License频段,可采取带内、保护带或独立载波等三种部署方式,与现有网络共存。可直接部署于GSM网络、UMTS网络或LTE网络,以降低部署成本、实现平滑升级。2、NBIOT的特点和目标(1)超强覆盖:相对GPRS来...

weixin_39534100的博客 1704

C++ virtual 继承问题

参考:https://www.cnblogs.com/chenhuan001/p/7190079.html 问题可以抽象为下面的问题: 普通人吃饭拿筷子,小孩吃饭拿勺子。 #include <iostream> using namespace std; class People { public: void eat() { get_util_to_eat(); } ...

GKoSon的博客 379

Android开发者必看:5分钟搞定MQTT客户端连接EMQX服务器(附完整代码)

本文为Android开发者提供了一份快速实现MQTT客户端连接EMQX服务器的实战指南。通过引入Eclipse Paho SDK,详细讲解了从项目配置、权限申请到核心连接、主题订阅与消息发布的完整流程,并附有即拿即用的Kotlin代码,帮助开发者在物联网应用中高效集成轻量级实时通信功能。

weixin_29228781的博客 271

轨迹规划——带抛物线过渡的直线插补

带抛物线过渡的直线插补

doudou2weiwei的博客 1984

关于c++析构函数要不要加virtual的问题

1.析构函数加virtual #include using namespace std; class CA { public: CA() { cout "CA()" << endl; } virtual ~CA() { cout "~CA()" << endl; } }; class CB : public CA { public: CB() { cout "CB

迎风的舵手 2475

数理金融学笔记 Chap2 二叉树模型Binomial

2 二叉树模型与期权定价 Binomial Model and Option Pricing 文章目录2 二叉树模型与期权定价 Binomial Model and Option Pricing单期二叉树模型 One-step Binomial Model风险与无风险资产单期二叉树模型与无套利条件无套利定价 No Arbitrage Pricing风险中性定价 Risk Neutral PricingDelta套期保值 Delta Hedging两期二叉树模型 Two-Step Binomial Model

weixin_66831131的博客 2387

【C++基础】virtual析构函数

若基类用于多态: 当derived class对象经由一个base  class指针被删除,而该base class带着一个non-virtual析构函数,其结构为定义,实际执行时通常发生的是对象的derived成分没被销毁.这通常会造成一个"局部销毁"对象,形成资源泄漏. 消除这个问题的做法很简单:给base class一个virtual析构函数.此后删除derived class对象就会销

王晓斌的专栏 929

数控系统(CNC)系列:Fanuc 31i-B_(5).基本操作与编程

Fanuc 31i-B 系统使用 G 代码和 M 代码进行编程。G 代码主要用于控制机床的运动,M 代码用于控制辅助功能,如冷却液开关、主轴启动等。G 代码:用于指定机床的运动方式。例如,G00 用于快速定位,G01 用于直线插补,G02 用于顺时针圆弧插补,G03 用于逆时针圆弧插补。M 代码:用于控制机床的辅助功能。例如,M03 用于启动主轴顺时针旋转,M05 用于停止主轴,M08 用于开启冷却液,M09 用于关闭冷却液。

2401_87715305的博客 1766

【信息系统项目管理师】高分论文:论信息系统项目的整合管理(绩效考核系统)

我们将项目管理计划中的子计划包括项目范围、进度、成本、质量管理计划,过程改进计划,人力资源管理计划,风险、采购管理计划,干系人管理计划,项目范围、成本、进度基准作为依据,查看项目的各个方面,通过组织全体团体成员会议来解读由各监控过程提供的信息,之后我与项目管理团队一起制订所需措施,确保项目绩效达到预期要求。在一个项目中,变更是必然的,也是不可避免的,进度拖延,成本失控,客户有新的需求等都会引起项目的变更。在本项目中,我要求有处于工作状态的产品,开发人员才可以对其任意修改,修改完成后,重新入库即可。

数据知道的博客 6886

virtual修饰类的成员函数/析构函数

不加virtual: 只释放基类内存,执行基类语义加 virtual: 释放派生类和基类内存,并且先执行派生类重写的语义。

qq_51950769的博客 533

国资e学快速学习实战教程

本文主要介绍了国资e学快速学习实战教程,希望能对同学们有所帮助。 文章目录 1. 前言 2. 实战教程

weixin_43178406的博客 11万+

C++基类析构函数为什么须加上virtual

要探讨这个问题,我们首先看看如下代码 #define DATA_LEN 1024 class Human { public: Human(int sex) : sex(sex) {} ~Human() { std::cout &lt;&lt; "Human distructiong" &lt;&lt; std::endl; } protected: int sex; }; ...

楼外楼 1166

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

C++基类的析构函数为什么需要加上virtual关键字

C++中基类采用virtual虚析构函数是为了防止内存泄漏。 具体地说,如果派生类中申请了内存空间,并在其析构函数中对这些内存空间进行释放。假设基类中采用的是非虚析构函数,当删除基类指针指向的派生类对象时就不会触发动态绑定,因而只会调用基类的析构函数,而不会调用派生类的析构函数。那么在这种情况下,派生类中申请的空间就得不到释放从而产生内存泄漏。所以,为了防止这种情况的发生,C++中基类的析构函数应采用virtual虚析构函数。 ...

技术成就梦想,梦想成就未来。If you try hard enough, it can be. 1666

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

C++析构函数前加上virtual的原因

class A {     public:         virtual void print(){cout&lt;&lt;"This is A"&lt;&lt;endl;} }; class B : public A {     public:     void print(){cout&lt;&lt;"This is B"&lt;&lt;endl;} } 虚函数:指向基类...

try_again_later的博客 3627

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

C++ 基类和派生类的virtual虚析构函数

virtual虚函数与C++的多态息息相关,C++中基类采用virtual虚析构函数主要目的是为了防止潜在的内存泄漏。 具体地说,如果派生类中申请了内存空间,并在其析构函数中对这些内存空间进行释放。假设基类中采用的是非虚析构函数,当删除基类指针指向的派生类对象时就不会触发动态绑定,因而只会调用基类的析构函数,而不会调用派生类的析构函数。那么在这种情况下,派生类中申请的空间就得不到释放从而产生内存...

hanzhen7541的博客 2841

继承基类析构函数一定要加上virtual

继承时,要养成的一个好习惯就是,基类析构函数中,加上virtual,为什么要加上呢?       看下未加virtual的代码执行结果:       #include "stdafx.h" #include #include #include #include #include using namespace std; class

青皮虾的专栏 3843

基类析构函数加上Virtual

下面的内容要说明两个问题:1. 基类的析构函数为什么要加上Virtual--防止内存泄露 1. 基类虚构函数无virtual,派生类无法析构,会导致内存泄露 #include <stdio.h> class Base { public: int a; Base(){ a=0; } ~Base(){ printf("base delete"); } virtual void setA()=0; }; cl

嵌入式与人工智能 621

多态基类的析构函数必须加上virtual

《Effective C++》说:         因为C++明确指出,当derived class对象经由一个base class指针被删除,而base class带着一个non-virtual析构函数,其结果未有定义---实际执行时通常发生的是对象的derived成分没被销毁。如:baseclass *ptb = derivedclassFuc() //子类的一个函数; 其中basecl

Allen 936
上一篇: c++类型转换运算符详解
下一篇: 网易c++引擎编辑器开发面试总结
Qt上位机开发
Qt上位机开发 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄9年 9664粉丝 178原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值