C++ 虚析构函数、纯虚析构函数

FCL碰撞检测库在Windows下的编译与配置(MinGW+CMake) 本文详细介绍了在Windows系统下使用MinGW和CMake编译配置FCL碰撞检测库的完整流程。内容涵盖MinGW-w64、CMake的安装与环境配置,关键依赖库Eigen和libccd的安装,以及FCL源码的编译、安装与实战测试。重点解析了CMake配置命令中的关键参数与常见错误解决方案,旨在帮助开发者高效完成FCL在Windows平台的部署,适用于机器人、游戏物理引擎等需要精确碰撞检测的开发场景。 阅读详情
虚析构函数
析构函数的工作方式是:最底层的派生类(most derived class)的析构函数最先被调用,然后调用每一个基类的析构函数。
因为在C++中,当一个派生类对象通过使用一个基类指针删除,而这个基类有一个非虚的析构函数,则结果是未定义的。运行时比较有代表性的后果是对象的派生部分不会被销毁。然而,基类部分很可能已被销毁,这就导致了一个古怪的“部分析构”对象,这是一个泄漏资源。排除这个问题非常简单:给基类一个虚析构函数。于是,删除一个派生类对象的时候就有了你所期望的正确行为。将销毁整个对象,包括全部的派生类部分。
但是,一般如果不做基类的类的析构函数一般不声明为虚函数,因为虚函数的实现要求对象携带额外的信息,这些信息用于在运行时确定该对象应该调用哪一个虚函数。典型情况下,这一信息具有一种被称为 vptr(virtual table pointer,虚函数表指针)的指针的形式。vptr 指向一个被称为 vtbl(virtual table,虚函数表)的函数指针数组,每一个包含虚函数的类都关联到 vtbl。当一个对象调用了虚函数,实际的被调用函数通过下面的步骤确定:找到对象的 vptr 指向的 vtbl,然后在 vtbl 中寻找合适的函数指针。这样子会使类所占用的内存增加。
 
定义纯虚析构函数(pure virtual destructor)
 
纯虚成员函数通常没有定义;它们是在抽象类中声明,然后在派生类中实现。比如说下面的例子:
class File //an abstract class
{
public:
 virtual int open(const string & path, int mode=0x666)=0;
 virtual int close()=0;
//...
};
但是,在某些情况下,我们却需要定义一个纯虚成员函数,而不仅仅是声明它。最常见的例子是纯虚析构函数。在声明纯虚析构函数时,不要忘了同时还要定义它。
class File //abstract class
{
public:
 virtual ~File()=0; //declaration of a pure virtual dtor
};
File::~File() {} //definition of dtor
为什么说定义纯虚析构函数是非常重要的
派生类的析构函数会自动调用其基类的析构函数。这个过程是递归的,最终,抽象类的纯虚析构函数也会被调用。
如果纯虚析构函数只被声明而没有定义,那么就会造成运行时(runtime)崩溃。(在很多情况下,这个错误会出现在编译期,但谁也不担保一定会是这样。)纯虚析构函数的哑元实现(dummy implementation,即空实现)能够保证这样的代码的安全性。
class DiskFile : public File
{
public:
 int open(const string & pathname, int mode);
 int close();
 ~DiskFile();
};
File * pf = new DiskFile;
//. . .
delete pf; //OK, ultimately invokes File::~File()
在某些情况下定义其它纯虚成员函数可能也是非常有用的(比如说在调试应用程序以及记录应用程序的日志时)。例如,在一个不应该被调用,但是由于一个缺陷而被调用的基类中,如果有一个纯虚成员函数,那么我们可以为它提供一个定义。
class Abstract
{
public:
 virtual int func()=0;
//..
};
int Abstract::func()
{
std::cerr<<"got called from thread " << thread_id<<
             "at: "<<gettimeofday()<<std::endl;
}
这样,我们就可以记录所有对纯虚函数的调用,并且还可以定位错误代码;不为纯虚函数提供定义将会导致整个程序无条件地终止。
14、OpenClaw(龙虾助手)Skill 开发完整规范(2026最新版) OpenClaw Skill 开发指南摘要: Skill 是 OpenClaw AI 助手的核心扩展机制,支持声明式(SKILL.md)和原生代码(JS/TS/Python)两种开发模式。声明式 Skill 通过 Markdown 定义触发条件和执行流程,适合简单业务;原生代码 Skill 提供完整编程能力,适合复杂场景。开发需遵循标准化项目结构,包含 SKILL.md(元数据)、manifest.json(权限声明)等文件,并严格处理错误和多系统适配。新版要求原生 Skill 必须声明文件、网络等权限,确 阅读详情

相关推荐

Win10或Win8下ObjectARX2015 Wizard向导创建项目失败解决方法

[原创]objectARX 2015 Wizard安装向导在Win8/win10下无法创建项目的解决方法总结 by edata @2017-5-1 objectARX 2015 Wizard安装向导在Win8/win10下无法创建项目的解决方法 因为Win8/Win10对系统盘(默认c:)使用了高级权限管理,所以在此盘下操作文件的修改工作都需要管理员权限才行。 基于这个原因,导致非管理员安

edata的博客 7029

c++之抽象类的纯虚析构函数

一、抽象类 1、纯虚函数 形式:virtual 函数原型=0; 定义:在定义一个表达抽象概念的基类时,有时无法给出某些函数的具体实现方法,就可以将这些函数声明为纯虚函数。 2.抽象类 定义:声明了纯虚函数的类,都成为抽象类。 主要特点:抽象类只能作为基类来派生新类,不能声明抽象类的对象。(既然都是一个抽象概念了,纯虚函数没有具体实现方法,故不能创造该类的实际的对象) 但是可以声明指向抽象类的指针...

weixin_42579072的博客 4787

大数据国赛第2套任务C-子任务一特征工程

根据**Hudi**的dwd_ds_hudi库中相关表或MySQL中shtd_store中相关表(order_detail、sku_info),计算出与用户id为6708的用户所购买相同商品种类最多的前10位用户(只考虑他俩购买过多少种相同的商品,不考虑相同的商品买了多少次),将10位用户id进行输出,若与多个用户购买的商品种类相同,则输出结果按照用户id升序排序,输出格式如下,将结果截图粘贴至客户端桌面【Release任务C提交结果.docx】中对应的任务序号下;

weixin_44117248的博客 904

C++——虚函数和纯虚函数、抽象类、虚析构和纯虚析构

C++虚函数、纯虚函数、虚析构、纯虚析构,其中虚函数的原理为重点

qq_42106610的博客 9358

1.2 固态变压器:传统工频变压器的局限与SST的技术起源

本小节明确传统工频变压器在电力系统中的基础定位与核心工作特性,系统分析其在新型电力系统场景下的固有技术瓶颈,梳理固态变压器(Solid State Transformer, SST,又称电力电子变压器Power Electronic Transformer, PET)从概念提出到工程化成熟的完整演进路径,为后续SST技术优势、设计需求与规范符合性要求的讲解建立底层逻辑,同时对应GB/T 40429-2021《电力电子变压器通用技术要求》的需求制定背景。

技术工作者 659

Python《打砖块》小游戏

Python《打砖块》小游戏!

PanDaoxi 1274

C++中的纯虚析构函数

什么是纯虚函数 纯虚函数比较特殊,在许多情况下,在基类中不能对虚函数给出有意义的实现,而是把它声明为纯虚函数,它的实现留给该基类的派生类去做。这就是纯虚函数的作用。 在C++中析构函数可以是纯虚的 记住最重要的事情之一,如果类包含纯虚析构函数,则必须为纯虚析构函数提供函数体。 为什么需要函数体呢?原因是因为析构函数(与其它函数不同)实际上并未被 “重写”,而是始终以派生类的相反顺序调用它们。这意味...

a15322910600的博客 2719

彻底解决Win11锁屏界面黑屏或者图片不变化

windows锁屏后黑屏

renkai721的专栏 1万+

C++基础---虚析构函数与纯虚析构函数

1. 虚析构函数与纯虚析构函数 1.1 虚析构函数与纯虚析构函数的定义 虚析构函数:为了解决基类的指针指向派生类对象,并用基类的指针删除派生类对象; 虚析构函数:当且仅当类里包含至少一个虚函数的时候才去声明虚析构函数,无故的声明虚析构函数和永远不去声明一样是错误的; class <类名> { virtual ~<类名>(); … }; 即:virtual ~A(); 纯虚析构函数:抽象类是准备被用做基类的,基类

Catherine的笔记 1795

手把手教你学simulink(26.7)--控制算法场景示例:基于模型预测控制(MPC)的智能温室环境控制系统

首先,我们需要将温室环境的动力学模型转换为状态空间形式。假设我们有四个状态变量:温度 TT、湿度 HH、光照强度 II 和二氧化碳浓度 CCO2CCO2​,以及四个控制输入:加热器功率 u1u1​、加湿器加湿量 u2u2​、通风扇风速 u3u3​ 和补光灯光照强度 u4u4​。状态空间模型可以表示为:x(t)=[T(t),H(t),I(t),CCO2(t)]Tx(t)=[T(t),H(t),I(t),CCO2​(t)]T 是状态向量。

MHD0815的博客 400

华为OD机试双机位C卷-员工派遣(Py/Java/C/C++/Js/Go)

华为OD机试双机位C卷【员工派遣】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试- 员工派遣,华为OD机考 - 员工派遣。

qq_45776114的博客 1671

纯虚析构函数

纯虚析构函数和普通纯虚函数的区别在于,纯虚析构函数需要提供函数的实现,而一般纯虚函数不能有实现,这样的原因在于,纯虚析构函数最终需要被调用,以析构基类对象,虽然是抽象类没有实体。而如果不提供该析构函数的实现,将使得在析构过程中,析构无法完成而导致析构异常的问题 Calss A {    public:    A(){}    virtual ~A()=0; } A::~A(){}

7708

Nvidia Jetson平台 JP4.2.1版本GStreamer视频采集异常问题调试记录

Nvidia Jetson平台GStreamer in JP4.2.1不能采集但是 v4l2-ctl和 ffmpeg能正常采集视频。

jzwjzw19900922的博客 2124

C++虚析构函数和纯虚析构函数

1、为什么要使用虚析构函数 我们知道析构函数是在对象生命周期结束时自动被调用,用来做一些清理工作(如释放句柄,释放堆内存等),防止出现内存泄漏。 那怎么还有虚析构函数呢? 使用虚析构函数的类一般是要作为基类,被其他类继承。通过把基类的析构函数声明为虚函数,就可以通过父类指针来释放子类对象,从而完成子类的一些清理工作,防止出现内存泄漏。 案例1:基类析构函数为非虚函数 //test.h class Parent { public: Parent(); ~Parent

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

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

C++虚析构函数与纯虚析构函数

C++虚析构函数与纯虚析构函数 虚析构函数 析构函数的工作方式是:最底层的派生类(most derived class)的析构函数最先被调用,然后调用每一个基类的析构函数。 因为在C++中,当一个派生类对象通过使用一个基类指针删除,而这个基类有一个非虚的析构函数,则结果是未定义的。运行时比较有代表性的后果是对象的派生部分不会被销毁。然而,基类部分很可能已被销毁,这就导致了一个

chenglinhust的专栏 1359

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

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

C++纯虚析构函数

图说C++对象模型:对象内存布局详解:https://blog.youkuaiyun.com/suchto/article/details/54947869?fps=1&amp;locationNum=9原文:https://blog.youkuaiyun.com/yby4769250/article/details/7294733纯虚析构函数和普通纯虚函数的区别在于,纯虚析构函数需要提供函数的实现,而一般纯虚函数不能有...

折腾怪的博客 9425

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

C++ 虚析构函数和纯虚析构函数

#include <iostream> using namespace std; /************************************************************************/ /* 虚析构函数和纯析构函数 1.当父类指针或引用指向子类对象时,若子类中数据成员有在堆区申请空间,父类析构函数需要 声明为虚析构函数或纯析构函数,析构时子类的析构函数会被调用,堆区空间会被释放,否则子类对象会出现内存泄漏问题 2.纯虚析构函数需要进行声明和类外.

CodeHouse的博客 636

C++ 虚析构函数,纯虚析构函数【转】

原文:http://blog.chinaunix.net/uid-20476365-id-1942463.html 虚析构函数析构函数的工作方式是:最底层的派生类(most derived class)的析构函数最先被调用,然后调用每一个基类的析构函数。 因为在C++中,当一个派生类对象通过使用一个基类指针删除,而这个基类有一个非虚的析构函数,则结果是未定义的。运行时比较有代表...

778

C++中的虚析构函数、纯虚析构函数详解

C++中析构函数可以为纯虚函数吗?众所周知,在实现多态的过程中,一般将基类的析构函数设为virtual,以便在delete的时候能够多态的链式调用。那么析构函数是否可以设为纯虚呢?class CBase { public: CBase() { printf("CBase()\n"); } virtual ~CBase

yapian8的专栏 3790

C++------虚析构函数与纯虚析构函数

#include &lt;iostream&gt; #include &lt;string.h&gt; using namespace std; //虚析构与纯虚析构 class Animal { public: virtual void speak() { cout &lt;&lt; "动物在说话" &lt;&lt; endl; } ~Animal() { cout &...

Allen_Xu17 578

c++纯虚析构函数:为何必须定义?

可以将基类的析构函数声明为纯虚函数,但必须为其提供定义。这看起来有些矛盾(纯虚函数通常不需要定义),但背后有严格的逻辑和内存管理需求。

LJY_CF的博客 508

C++虚析构函数、纯虚析构函数

析构函数的工作方式是:最底层的派生类(most derived class)的析构函数最先被调用,然后调用每一个基类的析构函数。 因为在C++中,当一个派生类对象通过使用一个基类指针删除,而这个基类有一个非虚的析构函数,则结果是未定义的。运行时比较有代表性的后果是对象的派生部分不会被销毁。然而,基类部分很可能已被销毁,这就导致了一个古怪的“部分析构”对象,这是一个泄漏资源。排除这个问题非常简单:给基类一个虚析构函数。于是,删除一个派生类对象的时候就有了你所期望的正确行为。将销毁整个对象,包括全部的派生类部分

我是guyue,guyue就是我O(∩_∩)O 2527

C++中虚析构函数和纯虚析构函数

可以看一下之前的博客: 1、C++纯虚函数和抽象类 2、C++继承中的构造和析构 3、C++之基类的析构函数要声明成虚函数 一. 虚析构函数 为了能够正确的调用对象的析构函数,一般要求具有层次结构的顶级类定义其析构函数为虚函数。因为在delete一个抽象类指针时候,必须要通过虚函数找到真正的析构函数。 class Base { public: Base(){} virtual ~Bas...

杨杨子江的博客 517

c++析构函数、虚析构函数、纯虚析构函数详解

我们知道对象在结束其生命周期之前,都会调用析构函数以完成必要的清理工作;派生类调用的析构函数顺序是“先子类,后基类”; 这篇文章用于总结当析构函数是普通析构函数、虚析构函数、纯虚析构函数时,我们使用delete运算符删除一个指针对象时,析构函数会有什么情况发生;普通析构函数CBase是基类,CDerive是其子类,类源码代码如下:class CBase { public: CBase(){}

Keep Moving~ 3239

C++ (纯)虚析构函数

偷偷拿来记录一下萌新的cs路——day 42 虚析构和纯虚析构函数

猫的博客 1260

C++中的虚析构函数、纯虚析构函数具体解释

C++中析构函数能够为纯虚函数吗? 众所周知。在实现多态的过程中,一般将基类的析构函数设为virtual。以便在delete的时候能够多态的链式调用。那么析构函数能否够设为纯虚呢? class CBase { public: CBase() { printf("CBase()\n"); } virtual ~CBase() = 0; // 析构函数是纯虚函数 }; 答案是能够。那么这样实现的目的是什么呢?当然

Doufu666的博客 1144
上一篇: C语言实现双向循环链表
下一篇: Makefile下 $(wildcard $^),$^,$@,$?,$<,$(@D),$(@F)
labrary
博客等级 码龄15年 8粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值