c++ --虚析构和纯虚析构

C++虚析构和纯虚析构 虚析构和纯虚析构 多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码 解决方式:将父类中的析构函数改为虚析构或者纯虚析构 虚析构和纯虚析构共性: 可以解决父类指针释放子类对象 都需要有具体的函数实现 虚析构和纯虚析构区别: 如果是纯虚析构,该类属于抽象类,无法实例化对象 虚析构语法: virtual ~类名(){} 纯虚析构语法: virtual ~类名() = 0; 类名::~类名(){} 示例: class Animal { public: Animal() 阅读详情

c++ --虚析构和纯虚析构

在c++中,我们知道在类内有些对象的成员需要在堆区创建空间,比如数组,其他类的对象做自己类的成员时需要创建空间,但是在调用多态中,需要父类指针或引用子类对象,那么在父类销毁指针时会调用父类的析构函数,那么子类的析构函数就不会被调用了,然后子类在堆区创建的空间就无法通过析构函数进行删除了,就会导致内存泄露,所以就要用虚析构或者纯虚析构来解决

语法

虚析构和纯虚析构的语法和虚函数与纯虚函数的语法相同
虚析构 virtual ~类名(){}
纯虚析构 virtual ~类名()=0;

代码

#include<iostream>
#include<string>
using namespace std;

class Animal
{
public:
	Animal()
	{
		cout << "animal类构造函数调用" << endl;
	}
	/*virtual ~Animal()
	{
		cout << "animal虚析构函数调用" << endl;
	}*/
	virtual ~Animal() = 0;
	//纯虚函数
	virtual void speak() = 0;

};
Animal::~Animal()
{
	cout << "animal类纯虚析构函数调用" << endl;
}

class Cat :public Animal
{
public:
	Cat(string name)
	{
		cout << "cat类构造函数调用" << endl;
		m_name = new string(name);
	}

	void speak()
	{
		cout <<*m_name << "小猫在说话" << endl;
	}
	~Cat()
	{
		if (this->m_name != NULL)
		{
			cout << "cat类析构函数调用" << endl;
			delete m_name;
			m_name = NULL;
		}
	}
	string* m_name;
};

void test01()
{
	string name1;
	cout << "请输入小猫名字" << endl;
	cin >> name1;
	Animal* ani = new Cat(name1);
	ani->speak();
	delete ani;
}

int main()
{
	test01();
	system("pause");
	return 0;
}

然后需要注意的是,无论是虚析构还是纯虚析构都需要有声明和实现
在代码中可以看到纯虚析构函数在类中进行了声明,然后在类外进行了定义
若无定义则运行会出错

当然如果子类中没有在堆区开辟数据,那么可以不需要父类写虚析构或者纯虚析构

有纯虚析构的父类也是抽象类

IDEA系列(四):IDEA导入Maven工程项目并配置Tomcat启动 本片文章主要介绍如何导入一个存在的maven项目并配置Tomcat启动项目,方便自己使用,也分享出来,希望可以帮助到其他人。 阅读详情

相关推荐

SAP PO开发-端到端配置

1.登录PO系统,选择system landscape,将外围系统的系统信息(Software Component以下简称SC)注册到PO系统中。2.点击products注册外围系统信息。3.选择New 新建 按钮:创建一个新的系统和版本。4.输入产品名称、供应商、版本号等信息。然后点击:Next。5.设置instance 名称,然后点击Next。6.最后设置软件组件的名称,然后点击Finish。

P9QCer的博客 1578

c++ 多态 学习总结3 虚析构和纯虚析构

为什么要用虚析构和纯虚析构: 在使用多态时,如果子类中有属性开辟到堆区,那么我们在释放(或delete)父类的指针时无法调用子类的析构代码,释放子类在堆区的内存,会导致内存泄漏的问题。 eg: #include <iostream> #include <string> using namespace std; class Animal { public: Animal() { cout << "这是Animal类的构造函数调用" << endl

chirou_的博客 1089

SceneSplat

目标:训练一个网络,输入高斯参数 → 输出与自然语言空间对齐的特征。考虑到标注语义的 3DGS 数据有限,作者设计了。策略,让模型在无标签场景上学到有用表征。都有一个与自然语言对齐的语义特征。这是整个方法的第一步,目标是让。

weixin_61091146的博客 1284

【C++学习笔记(二十)】之虚析构函数与纯虚析构函数

一. 虚析构函数        子类继承了父类,但是普通析构函数是不会调用子类的析构的,所以可能会导致内存释放地不干净。我们需要使用虚析构函数来解决。        写法:               Virtual ~Animal(){}        虚析构函数是为了解决基类的

开发小鸽 799

AI计算,为什么要用GPU?

几年后,2012年,神经网络之父杰弗里·辛顿(Geoffrey Hinton)的两个学生——亚历克斯·克里切夫斯基(Alex Krizhevsky)、伊利亚·苏茨克沃(Ilya Sutskever),利用“深度学习+GPU”的方案,提出了深度神经网络AlexNet,将识别成功率从74%提升到85%,一举赢得Image Net挑战赛的冠军。根据形态,GPU可分为独立GPU(dGPU,discrete/dedicated GPU)和集成GPU(iGPU,integrated GPU),也就是常说的独显、集显。

经营范围: CTA、SRRC、CCC、移动、电信、联通入库 1675

SQL注入绕过information_schema:实战技法与替代路径详解

SQL注入是Web安全领域的核心漏洞类型,其原理是通过构造恶意SQL语句,干扰应用程序与数据库的正常交互逻辑,从而窃取或篡改数据。在渗透测试与CTF竞赛中,绕过常见防护措施是提升技术能力的关键。当标准的信息收集方式受阻时,例如无法访问information_schema数据库,攻击者需要掌握替代的元数据获取方法。这些技术价值在于模拟真实环境中日益严密的防御体系,锻炼在受限条件下的系统性信息收集思维。典型的应用场景包括存在WAF过滤、权限限制或编码干扰的实战环境。本文将围绕SQL注入这一核心,深入探讨如何利用

weixin_33980459的博客 430

虚析构函数详解

众所周知,virtual函数(虚函数),是实现动态调度(运行时多态) 概念:当基类指针指向子类对象时候,虚函数能实现运行时多态(多态指:同一个接口的不同实现方式) 虚析构函数:当基类指针指向指针对象的时候,需要把基类的析构函数设置成虚析构,防止内存泄露 1、当基类析构函数不设置为虚析构 class BaseClass { public: BaseClass() {} ~BaseCl...

qq_15821883的博客 1万+

CELF(Cost-Effective Lazy Forward selection)具有成本效益的惰性前向选择算法

CELF(Cost-Effective Lazy Forward selection)算法解析      引言:在社交网络影响力最大化问题的求解过程中,我们往往需要去选择一些目标种子结点作为信息初始传播的源头。贪婪算法在传播效果上的解决可以达到影响的最大化,但是在时间复杂度上面显得确十分糟糕。为此CELF算法应势而生,CELF算法利用了函数次模性的特点,在第一轮选择种子结点时,计算网络中所有节点的边际收益,但将在之后的过程中,不再做网络节点边际收益的重复计算,这相对于传统的贪婪算法,将在时间上得到非常明显的

hahaxq的博客 2477

【C++】多态 ⑤ ( 虚析构函数 | 虚析构函数语法 | 虚析构函数意义 | 父类指针指向子类对象情况下父类和子类使用 virtual 虚析构函数 | 代码示例 )

一、虚析构函数 1、构造函数不能是虚函数 2、析构函数可以是虚函数 3、虚析构函数语法 4、虚析构函数意义 二、代码示例 - 虚析构函数 1、代码示例 - 没有使用虚析构函数导致子类析构函数无法调用 2、代码示例 - 使用虚析构函数正确示例

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 3998

deepfake detection数据集

最全Deepfake数据集总结,包含各个数据集下载链接: https://github.com/deepfakeinthewild/deepfake_in_the_wild Dataset name Download Generate method Deepfake videos Actors Deepfake-TIMIT low download De...

where_is_horse的博客 1万+

PCB高速信号换层孔新技术:VECS(Vertical Conductive Structure Technology)解析

摘要:垂直导电结构(VeCS)是一种新型PCB互连技术,由平板信号走线和椭圆形接地层构成半同轴结构,相比传统过孔具有显著优势。通过全波仿真和实测验证,VeCS展现出更好的阻抗连续性、更低的插入损耗和回波损耗,以及优异的串扰抑制能力。其椭圆形接地结构能有效隔离电磁干扰,在相同布线密度下远端串扰比传统过孔降低约50%。VeCS制备工艺与传统PCB工艺兼容,无需新增设备,且能实现更高密度互连。测试结果显示,2.5英寸带状线通道中VeCS结构的信号完整性表现明显优于传统过孔,为高速数字系统提供了更可靠的垂直互连解决

小孟同学的博客 202

虚析构函数

虚析构函数可以解决基类的指向派生类对象,并用基类的指针直接释放派生类对象的问题。 当一个类不准备作为基类使用时,使用虚析构函数并不是一个好主意。因为不作基类的情况下,这个类就没有必要定义其他虚函数,采用虚析构函数会为类增加一个虚函数表指针的长度,使得类对象占用的空间增加,还有可能降低其可移植性。如下代码所示: #include "stdafx.h" class Base { public: ~Base() { printf("The Base Destruct...

weixin_45522766的博客 2528

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C++:虚析构和纯虚析构

C++:虚析构和纯虚析构 一、虚析构 -若子类中存在指向堆区的属性,须利用虚析构技术(将父类析构函数写成虚函数),在delete时,才会调用子类的析构函数。 #include <iostream> #include <string> using namespace std; class Animal { public: Animal() { cout<<"Animal默认构造函数调用"<<endl; } // 虚析构.

青瓦松 695

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

c++虚析构和纯虚析构

4.7.5 虚析构和纯虚析构 纯虚析构的使用场景:多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码。(1.父类指针指向子类对象,2.子类在堆区有数据) 解决方式:将父类中的析构函数改为虚析构或者纯虚析构 虚析构和纯虚析构共性: 可以解决父类指针释放子类对象 都需要有具体的函数实现 虚析构和纯虚析构区别: 如果是纯虚析构,该类属于抽象类,无法实例化对象 虚析构语法: virtual ~类名(){} 纯虚析构语法: virtual ~类名() = 0; 类

admin的博客 682

C++学习笔记之虚析构和纯虚析构/虚析构和纯虚析构的学习/虚析构和纯虚析构学习

C++学习笔记之虚析构和纯虚析构/虚析构和纯虚析构的学习/虚析构和纯虚析构学习 多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码。 解决办法: 将父类中的析构函数改为虚析构或者纯虚析构 虚析构和纯虚析构共性: 可以解决父类指针释放子类对象 都需要有具体的函数实现 虚析构和纯虚析构区别: 如果是纯虚析构,该类是抽象类,无法实例化对象。 虚析构语法 virtual ~类名(){} 纯虚析构语法 virtual ~类名() = 0; 类名::~类名(){} 虚析构或纯虚析构

qq_36711295的博客 268

c++之虚析构和纯虚析构

虚析构和纯虚析构 多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码 解决方式:将父类中的析构函数改为虚析构或者纯虚析构 虚析构和纯虚析构共性: 可以解决父类指针释放子类对象 都需要有具体的函数实现 虚析构和纯虚析构区别: 如果是纯虚析构,该类属于抽象类,无法实例化对象 虚析构语法: virtual ~类名(){} 纯虚析构语法: virtual ~类名(...

干啥啥不行,但是也要干的博客 426

C++虚析构和纯虚析构问题小记

C++虚析构和纯虚析构问题小记   在我们使用多态的时候,当我们不对父类析构函数做额外操作的话,它仅仅是析构父类自身,不会调用子类的析构,所以可能会导致释放不干净;但是对父类的析构函数加上virtual关键字,就成了虚析构,这样就可以在多态中,连同子类一起析构了。   纯虚析构函数和普通的纯虚函数写法一样,就是有一点区别是必须要为纯虚析构函数提供一个函数体,且是类内声明,类外实现。如果函数中出现了 纯虚析构函数,那么这个类也算抽象类,不能创建对象。 #include<iostream> usin

kuanyew的博客 507

C++多态:纯虚函数和抽象类、虚析构和纯虚析构

在上述代码中,子类Cat中有在堆区存放的成员变量m_name,当父类中的析构函数不是虚构函数或纯虚析构函数时,delete animal;在使用多态时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码,此时就用到了虚析构函数,只需将父类中的析构函数改为虚析构函数或者纯虚析构函数就可以解决父类指针无法释放子类对象的问题。因此在多态中,通常父类中虚函数的实现是毫无意义的,主要都是调用子类重写的函数,因此可以将虚函数改为纯虚函数。类名::~类名(){}`

weixin_45725144的博客 1705

【C/C++】虚析构和纯虚析构

声明一个`pure virtual` 函数的目的是为了让 `derived classes` 只继承函数接口,派生类必须提供实现

zsyyugong的博客 323

c++学习之虚析构和纯虚析构

1.多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用子类的析构代码; 解决方法:将父类中的析构函数改为虚析构或者是纯虚析构。 2.虚析构和纯虚析构共性 (1)都可以解决父类指针无法释放子类对象的问题 (2)都需要有具体的函数实现 (3)如果是纯虚析构,该类属于抽象类,我无法实例化对象 3.虚构语法virtual ~类名(){} 纯虚析构语法virtual ~类名(){} 代码示例 #include <iostream> using namespace std; #includ

weixin_42097108的博客 182

C++中虚析构和纯虚析构的区别

首先虚析构和纯虚析构都是为了解决多态中子类有堆区数据,父类释放时无法释放子类的堆区数据而导致内存泄露的问题。 虚析构和纯虚析构都能解决上述问题,但是虚析构和纯虚析构有很大的不同。 1.语法不同 虚析构语法: virtual~ 类名(){}; 虚析构也需要实现内部函数 纯虚析构语法: virtual~类名() = 0; 纯虚析构也需要实现内部函数,但是是在内外 实现方式 作用域::~类名(){}; 2.纯虚析构函数写了之后,这个类也属于抽象类,而无法实例化对象。 下面是具体代码实例: cla

qq_51654808的博客 1638

C++ 多态(三) 虚析构和纯虚析构

为神魔要用虚析构(纯虚析构)? 父类指针在析构时不会调用子类析构函数,这会使得子类中堆区内存无法释放,从而导致内存泄漏。 虚析构语法: virtual ~类名(参数列表){ 具体实现 } 纯虚构语法: virtual ~类名(参数列表)=0; 类名::~类名(参数列表){ 具体实现 } 虚构函数与纯虚构函数的共性 都可以解决父类指针释放子类对象 都必须有具体函数实现 虚构函...

qq_44620773的博客 343

C++入门学习:虚析构和纯虚析构*

使用虚析构解决父类指针无法完全释放子类对象问题

Miki Makimura 的博客 696

C++学习Day07之虚析构和纯虚析构

C++之虚析构和纯虚析构

似霰的博客 339
上一篇: c++ --纯虚函数和抽象类
下一篇: c++ ---函数模板及注意事项
RejectiveΘ
博客等级 码龄6年 8粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值