虚拟析构函数是继承的吗?

2023-12-13

如果我有一个带有虚拟析构函数的基类。派生类也有声明虚拟析构函数吗?

class base {
public:
    virtual ~base () {}
};

class derived : base {
public:
    virtual ~derived () {} // 1)
    ~derived () {}  // 2)
};

具体问题:

  1. 1) 和 2) 相同吗? 2)是因为它的基础而自动虚拟还是它“停止”虚拟性?
  2. 派生析构函数如果无关的话可以省略吗?
  3. 声明派生析构函数的最佳实践是什么?声明它是虚拟的、非虚拟的还是如果可能的话省略它?

  1. 是的,它们是一样的。派生类不声明虚拟的东西并不能阻止它成为虚拟的。事实上,如果任何方法(包括析构函数)在基类中是虚拟的,则无法阻止它在派生类中成为虚拟的。在 >=C++11 中你可以使用final以防止它在派生类中被重写,但这并不能阻止它成为虚拟的。
  2. 是的,派生类中的析构函数如果无关的话可以省略。是否虚拟并不重要。
  3. 如果可能的话我会省略它。我总是使用virtual关键字或override为了清楚起见,对于派生类中的虚函数。人们不应该必须沿着继承层次结构一路向上才能弄清楚函数是虚拟的。此外,如果您的类是可复制或可移动的,而无需声明您自己的复制或移动构造函数,则声明任何类型的析构函数(即使您将其定义为default)将强制您声明复制和移动构造函数以及赋值运算符(如果您需要它们),因为编译器将不再为您添加它们。

作为第 3 项的一个小要点。注释中指出,如果未声明析构函数,编译器会生成默认析构函数(仍然是虚拟的)。默认函数是内联函数。

内联函数可能会将程序的更多部分暴露给程序其他部分的更改,并使共享库的二进制兼容性变得棘手。此外,面对某些类型的更改,增加的耦合可能会导致大量的重新编译。例如,如果您决定确实想要虚拟析构函数的实现,那么调用它的每一段代码都需要重新编译。而如果您在类主体中声明了它,然后在类中将其定义为空.cpp文件,您可以更改它而无需重新编译。

我个人的选择仍然是尽可能忽略它。在我看来,它会使代码变得混乱,并且编译器有时可以使用默认实现而不是空实现来完成稍微更有效的事情。但你可能会受到一些限制,这使得这是一个糟糕的选择。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

虚拟析构函数是继承的吗? 的相关文章

随机推荐

  • 嵌套函数定义和范围(UnboundLocalError)[重复]

    这个问题在这里已经有答案了 为什么下面的代码无效 def foo1 x 5 def bar if x 5 x 6 print x bar 虽然此代码有效 def foo2 x 5 def bar if x 5 print ok print
  • 使用 jQuery 获取 html 元素的宽度(以百分比 % 表示)

    If I alertcss 选择器设置为的元素width 100 我明白了px 有什么方法可以让它进来吗 根据 css 设置 我需要它来修复一些具有流畅布局的脚本 css my element width 100 javascript al
  • 对指针列表进行排序时出现问题

    我正在尝试对指针列表进行排序 在我的例子中 每个指针都是 Job 类型 我的目的是按序列号对作业进行排序 void Container jobSort list
  • ionic 2 如何使用索引动态加载

    对于 ionic 1 我已经这样做了ng if index 3 0 但我需要在网格视图中动态加载数据 其中一行有两个列 我怎样才能做到这一点 我尝试了下面的代码 in my schudle ts ResourceData name ksjs
  • 比较两个二维数组并获取交集和差异

    我想比较两个数组之间整行的数据并生成 相交行的数组和 一个数组 其中第一个数组中的行在第二个数组中找不到 并且 一个数组 其中在第一个数组中找不到第二个数组中的行 我有两个多维数组 array1 sight id gt 13 locatio
  • JavaScript createElementNS 和 SVG

    我想使用 Javascript 创建内联 SVG 图形 然而 似乎createElementNS函数应用一些标准化并将所有标签转换为小写 这对于 HTML 来说很好 但对于 XML SVG 来说就不行了 我使用的NS是http www w3
  • 如何在 PHP 中传递系统命令时转义字符

    我有一个运行 PHP HTML 页面的 Linux Web 服务器 for loop instruction I m constructing the instruction here instruction lspci grep i vg
  • 如何使用 python 3.2 安装 MySQLdb

    我正在尝试使用 python 连接到 mySQL 据我了解 你需要有 MySQLdb 它是一些 python 连接器模块 我的第一个问题是没有正确版本的 mySQLdb 可以找到here 然后我应该打开一个命令行窗口并导航到我刚刚下载的文件
  • Python 子集和

    我正在尝试编写一个函数 该函数不仅可以确定集合的子集之和是否添加到所需的目标数字 而且还可以打印作为解决方案的子集 这是我用于查找子集是否存在的代码 def subsetsum array num if num 0 or num lt 1
  • 如何在 React js Web 应用程序中添加 PAYTM 网关集成?

    我从这里开始工作https github com paytm paytm pg node sdk sample blob master javascript DemoApp js我在 Express 中使用了它 它正在工作 但现在我想从反应
  • 与尺度无关的元素

    我正在开发一个 2D 计算几何库 我希望能够吐出图片来帮助调试 我想要的图元是点 线段和文本 但我事先不知道我有兴趣查看什么比例 也许只有一小部分多边形无法正常工作 所以我也需要能够缩放和平移图像 我挂了SVGPan当我在 Chrome 中
  • 如何为凸包算法的中间步骤设置动画?

    我正在尝试制作某种动画 以便用户可以理解或看到查找点集的凸包所采取的步骤 例如 假设我使用下面的代码进行 Graham Scan 有哪些方法可以对线条添加和删除进行动画处理 即使对于很多点 也需要时间来处理 然后几乎立即将它们全部绘制出来
  • 使用 BOOST::associative property map 插入 boost::BIMAP ... 失败

    参考我之前提出的有关 boost bimaps 和 boost 关联属性映射接口的问题here 我想为我的 bimap 使用 Put 和 Get 辅助函数 参考给出的示例代码here 我尝试添加以下内容 但由于断言失败而出现很长的编译错误
  • “int”对象没有属性“x”

    我正在尝试制作一个程序来添加向量 add class vects def init self x y self x x self y y def add self vect total x self x vect x total y sel
  • 通过服务将 Symfony EntityManager 注入表单类型

    我需要根据实体是否是最新发布的版本来修改表单中的一些字段 标签和类 因此 我需要能够将实体管理器注入到我的 formType 中 以便在事件侦听器中我可以将当 前版本与实体的已发布版本进行比较 但我什至无法得到entityManager首先
  • 如何调试 git svn 获取无效的 XML

    我尝试使用将 SVN 存储库转换为 gitgit2svn 我的服务器使用用户名和密码 I did svn2git https example com svn bar 并得到错误 Initialized empty Git repositor
  • CSS 水平滚动溢出与 jQuery 滑块

    我正在尝试设置一个全屏 jquery 滑块 我将项目分为两个步骤 1 css 和 2 js 1 CSS 下面是我正在拍摄的图片 没有固定高度 下面是我到目前为止不起作用的代码
  • 如何在给定时间后重新加载网页的一部分?

    我想做的是 根据特定条件显示一条消息 因此 我将在给定时间后连续读取数据库 并相应地向用户显示消息 但我希望该消息仅在页面的一部分 比如说 DIV 上更新 任何帮助 将不胜感激 谢谢 这可以使用setInterval and jQuery
  • 如何将日期对象添加到 C# 列表? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 早些时候我已经发布了这个问题排序日期和时间 答案是mi
  • 虚拟析构函数是继承的吗?

    如果我有一个带有虚拟析构函数的基类 派生类也有声明虚拟析构函数吗 class base public virtual base class derived base public virtual derived 1 derived 2 具体