当前位置: 首页 > news >正文

条款07:为多态基类声明一个virtual析构函数

目录

1.问题

2.如何解决

3.注意事项


1.问题

定义一个记录时间的基类

class TimeKeeper
{Timekeeper();~Timekeeper();
};

派生类作为不同的计时方法,原子钟,水钟,腕表。

class AtomicClock : public TimeKeeper {...};
class WaterClock : public TimeKeeper {...};
class WristWatch : public TimeKeeper {...};

客户使用你的代码时,只想使用时间,不关系是如何计时的。可以使用工厂模式,返回一个基类的指针。

TimeKeeper *ptk = getTimerKeeper();delete ptk;

getTimerKeeper() 返回的对象必须是在堆上开辟的空间,如果在栈上除了作用与就会销毁。

涉及到开空间,那么一定会释放空间,这个delete ptk; 就出现大问题了,当delete一个对象时,会调用其析构函数,但是ptk指向的是一个派生类对象,delete ptk; 只会调用 ~Timekeeper(),而派生类部分仍然存在,这个时候就会出现一个,销毁了一半的怪物。

2.如何解决

只需将基类的虚构函数声明为 virtual即可解决这个问题。

class TimeKeeper
{Timekeeper();virtual ~Timekeeper();
};

因为这个时候去 delete ptk; 会变成多态调用,先去调用最深层次派生的析构,依次向上到基类。

3.注意事项

virtual不是胡乱加的,如果一个类成员是 两个整形的变量,那么这个类的大小是64bit,如果你添加了一个虚函数,在类空间的起始位置会添加一个虚表指针,如果是32位的机器类的大小是96bit,如果是64位机器类的大小来到了128bit。

而且添加虚函数之后,你无法将其传递给其他,语言写的函数,因为虚表指针是C++特有的。

相关文章:

  • SL1680 SoC本地运行DeepSeek R1 1.5B大模型
  • vue将“00:00:09“的时间转换为秒,将时分秒hh:mm:ss的格式转换为秒,
  • 搭建 vue 项目环境详细步骤
  • qt+mingw64+cmake+libqrencode项目编译和搭建成功记录
  • Jsp技术入门指南【四】详细讲解jsp与Servlet的对比和Jsp生命周期和工作原理
  • VBA技术资料MF293:不打开工作簿获取值
  • 【运维学习】lvs + keepalived + 主从dns 项目搭建
  • 运筹学之指派问题(原始匈牙利算法以及KM算法)
  • 深度学习 从入门到精通 day_02
  • Google Test 与 Google Mock:C++ 测试与模拟的完美结合
  • 于 Jupyter 天地,借 NumPy 之手编织数据锦缎
  • 管家婆财贸ERP BB106.采购开票选单批量过滤
  • Linux之 grep、find、ls、wc 命令
  • [数据结构]哈希表
  • 3DMAX粒子流样条线生成器PFSpliner使用方法详解
  • 【AI News | 20250417】每日AI进展
  • 金蝶云星空API接口调试postman
  • Mybtis和Mybatis-Plus区别
  • 4月17日星期四今日早报简报微语报早读
  • 高效检测书签网址,告别无效链接烦恼
  • 中国海警位中国黄岩岛领海及周边区域执法巡查
  • 特朗普加征关税冲击波:美国零售、汽车、航空、科技企业纷纷预警业绩波动
  • 白玉兰奖征片综述丨国产剧集创作的此消彼长
  • 国铁集团郑州局预计“五一”发送642.5万人
  • 金科股份:去年营收约275亿元,今年确保所有项目“零烂尾”
  • 王毅:坚持金砖团结合作,改革完善全球治理