C++11接口纯虚析构函数

2024-01-10

UPD。有一个标记表明它是重复的这个问题 https://stackoverflow.com/questions/11494422/default-pure-virtual-destructor。但在这个问题中,OP询问如何使用default定义纯虚拟析构函数。这个问题是关于有什么区别.

在 C++ 中(如果可能的话,最新标准)real使用空主体实现定义纯虚拟析构函数与仅空主体(或默认)之间的区别?

变体 1:

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

变体2.1:

class I21 {
public:
    virtual ~I21() = 0;
};

I21::~I21() {}

变体2.2:

class I22 {
public:
    virtual ~I22() = 0;
};

I22::~I22() = default;

Update我发现变体 1 和变体 2.1/2.2 之间至少有 1 个差异:

std::is_abstract::value is false对于变体 1,以及true对于变体 2.1 和 2.2。

Demo http://ideone.com/HL7OKe

也许有人能发现 2.1 和 2.2 之间的区别?


正如您所指出的,I1 和 I2* 之间的区别在于添加= 0使类变得抽象。事实上,使析构函数成为纯虚函数是trick当你没有任何其他函数是纯虚函数时,使类成为抽象类。我说这是一个技巧,因为如果您想析构它的任何派生类(在这里您会这样做),则析构函数不能保持未定义状态,那么您仍然需要定义析构函数,无论是空的还是默认的。

现在,空的或默认的析构函数/构造函数(I21 和 I22)之间的区别更加模糊,没有太多写出来。推荐的一种是使用default,既作为一个新的习惯用法让你的意图更清晰,而且显然也给编译器一个优化的机会。引用msdn https://msdn.microsoft.com/en-us/library/dn457344.aspx#Anchor_1

由于简单的特殊成员函数具有性能优势,因此当您需要默认行为时,我们建议您优先选择自动生成的特殊成员函数而不是空函数体。

除了可能的性能改进之外,两者之间没有明显的差异。= default是从 C++11 开始的方法。

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

C++11接口纯虚析构函数 的相关文章

  • 如何使用C从http下载文件?

    最近几天我试图弄清楚如何从 URL 下载文件 这是我对套接字的第一个挑战 我用它来了解协议 所以我想在没有 cURL 库的情况下只用 C 语言来完成它 我搜索了很多 现在我可以打印页面的源代码 但我认为这与文件不同 我不必只将接收到的数据从
  • 与 MinGW 的静态和动态/共享链接

    我想从一个简单的链接用法开始来解释我的问题 假设有一个图书馆z它可以编译为共享库 libz dll D libs z shared libz dll 或静态库 libz a D libs z static libz a 让我想要链接它 然后
  • Windows Phone 7 - ScrollViewer 值已更改

    我一直在寻找解决方案 但无法找到正确的解决方案 我的网格宽度为 960 并且有ScrollViewer在里面 现在我想知道滚动时滚动的值 水平偏移 我找到的所有解决方案都是针对 wpf silverlight 的 它对我不起作用 Edit
  • 如何在 Linux 上重新实现(或包装)系统调用函数?

    假设我想完全接管 open 系统调用 也许要包装实际的系统调用并执行一些日志记录 一种方法是使用 LD PRELOAD http scaryreasoner wordpress com 2007 11 17 using ld preload
  • 维护 VS Test Project 中单元测试方法之间的上下文

    我想按顺序运行以下单元测试 使用随机数字的名称 密码等创建新客户 检索刚刚创建的客户并断言其属性包含相同的随机数 对同一用户调用 ForgotPassword 函数 并使用相同的随机数作为用户名 清楚地看到 我需要生成一次随机数 并在 3
  • 加载 QPixmap 数据的更好方法

    更好的方法来做到这一点 没有QImage QImage image width height QImage Format RGB888 memcpy image bits m frameRGB gt data 0 height width
  • 公交车公共交通算法

    我正在开发一个可以查找公交路线的离线 C 应用程序 我可以提取时间表 巴士 路线数据 我正在寻找适用于基本数据的最简单的解决方案 可以使用什么算法来查找从巴士站 A 到巴士站 B 的路线 是否有适用于 C Java 的开源解决方案 数据库的
  • 大量互斥体对性能的影响

    假设我有一个包含 1 000 000 个元素的数组 以及多个工作线程 每个线程都操作该数组中的数据 工作线程可能会使用新数据更新已填充的元素 但每个操作仅限于单个数组元素 并且独立于任何其他元素的值 使用单个互斥锁来保护整个数组显然会导致高
  • 从图像创建半透明光标

    是否可以从图像创建光标并使其半透明 我目前正在拍摄自定义图像并覆盖鼠标光标图像 如果我可以将其设为半透明 那就太好了 但不是必需的 销售人员喜欢闪亮的 目前正在做这样的事情 Image cursorImage customImage Get
  • DateTime.ParseExact - 为什么 yy 变成 2015 而不是 1915

    为什么 NET 假定以下年份是 2015 年 而不是 1915 年 var d DateTime ParseExact 20 11 15 dd MM yy new CultureInfo en GB 我想 它会尝试接近 但其背后是否有合理的
  • 如何在 C++ 中正确使用 cin.fail()

    我正在编写一个程序 从用户那里获取整数输入cin gt gt iUserSel 如果用户输入一个字母 程序就会进入无限循环 我试图用下面的代码来阻止这种情况 但程序进入无限循环并打印出 错误 输入 我该如何修复我的程序 cin gt gt
  • 如何从 Powerpoint 2010 导出电影?

    如何使用 MS Office PIA 主互操作程序集 或其他方式以编程方式将嵌入视频从 powerpoint 2010 导出到外部文件 在演示文稿中嵌入视频是 Powerpoint 2010 中的一项新功能 我找不到解决方案 PPTX 文件
  • 使用任一默认捕获模式时,这是通过复制捕获还是 (*this) 通过引用捕获?是一样的吗?

    当我看到以下工作时我有点困惑 struct A void g void f g 但后来我发现this https stackoverflow com a 16323119 5825294答案非常详细地解释了它是如何工作的 本质上 它归结为t
  • 运行实体框架自定义工具,它有什么作用?

    在 Visual Studio 中 当使用实体框架并为 tt 和 Context tt 文件应用运行自定义工具时 它是什么以及它有什么作用 为什么它解决数据库同步问题 有时 为什么我应该在运行 tt 之前运行它 Context tt 它被称
  • 如何在VS2005中使用从.bat而不是.exe启动的外部程序进行调试?

    在我的 c 项目的调试属性中 我选择了 启动外部程序 并选择了我希望将调试器附加到的程序的 exe 但是 现在我需要从 bat 文件而不是 exe 启动程序 但 VS2005 似乎不允许这样做 这可能吗 编辑 为了澄清 我需要调试从 bat
  • 从单应性估计 R/T

    我一直在尝试计算 2 个图像中的特征 然后将这些特征传递回CameraParams R没有运气 特征已成功计算并匹配 但是问题是将它们传递回R t 我明白你必须分解Homography为了使这一点成为可能 我已经使用如下方法完成了 http
  • g++ / gcc 是否支持 C++20 新的atomic_flag 功能?

    根据参考参数 https en cppreference com w cpp atomic atomic flag c 20 有丰富的 对我来说有用的 支持atomic flag运营 然而 目前尚不清楚 gcc 是否支持这些功能 它们在任何
  • Windows Phone 的 JSON 反序列化

    我正在尝试反序列化以下 JSON 但我真的不知道如何使用 JSON net 来完成这项工作 我正在使用 C 和 JSON Net 库 我的 JSON 如下 found 3 bounds 43 54919 172 62148 43 54487
  • 查找数组中的多个索引

    假设我有一个像这样的数组 string fruits watermelon apple apple kiwi pear banana 是否有一个内置函数可以让我查询 apple 的所有索引 例如 fruits FindAllIndex ap
  • 如何防止 Lotus Notes 用户转发或复制通过 System.Net.Mail 发送的邮件?

    我想使用 SMTP 客户端 uiing microsft net 以 C 作为编程语言发送电子邮件 但是对于通过SMTP客户端发送的电子邮件 我们是否可以添加 禁止转发 或 禁止复制 等安全功能 我不希望电子邮件的收件人转发或复制电子邮件的

随机推荐

  • Swift 中的 For 循环

    突然 我在Apple文档中学到的for循环结构停止工作 它显示一个错误 预期声明 谁能告诉我新语法是什么 let CirclePoints 84 var circlePoint 0 for circlePoint in 0
  • 合并树结构中分支的模式或算法?

    我正在尝试将 DAG 有向无环图 映射到下面显示的结构中 这是我开始的 DAG 的示例 其中弧线总是从左向右 然后 我恢复该图并将其跨越到具有重复节点的树中 如下所示 我正在寻找的是一些算法或模式来实现以下合并结构 注意再次恢复 目标是生成
  • Angular 应用程序无法在 Azure 上找到资产文件

    我刚刚通过运行 ng build prod 并将其推送到 git 将我的 Angular 应用程序部署到 azure 但收到 404 错误 指出它找不到资产文件夹中的 json 文件 我也尝试过运行 ng build prod base h
  • 如何从 Eclipse 设置 java.library.path

    我怎样才能设置java library path对于整个 Eclipse 项目 我正在使用一个依赖于操作系统特定文件的 Java 库 并且需要找到一个 dll so jnilib 但应用程序总是退出并显示一条错误消息 指出在库路径上找不到这
  • 使用 OpenCV3 进行视频中的人脸识别时出现未处理的异常 (opencv_core310.dll)

    下面的代码用于识别我从下面的链接获得的脸部 http docs opencv org 3 0 beta modules face doc facerec tutorial facerec video recognition html htt
  • Firebase:如何将视频存储在存储中,然后将视频 URL 存储在数据库中?

    这是我第一次使用 Firebase 我读到您应该将视频存储在存储中 然后将该唯一的 URL 存储在其数据库中 我将如何采取这种方法 例如 如果用户请求播放特定视频 我如何从数据库中获取 URL 然后使用该 URL 将视频从数据库中提取出来
  • 使用字符串引用时,引用 Powershell 数组索引会产生意外结果

    我试图找出为什么会发生以下情况 如果您有 arr Filename1 Filename2 for i 0 i le arr Length 1 i write host arr i write host arr i write host ar
  • 使用 AVPlayer 时保持良好的滚动性能

    我正在开发一个有集合视图的应用程序 并且集合视图的单元格可以包含视频 现在我正在使用以下方式显示视频AVPlayer and AVPlayerLayer 不幸的是 滚动性能很糟糕 这好像是AVPlayer AVPlayerItem and
  • 当图像较小时,在引导模式中垂直对齐中心

    我正在使用引导模式来显示不同尺寸的图像 我希望模态主体具有最小的宽度和高度 实际上是 600 400 因此 当图像较大时 它会扩展并运行良好 但当图像的高度低于 400 像素时 图像会在顶部 垂直 对齐 所以我想将它垂直对齐在模态主体的中间
  • gwt 的日期时间库

    我正在开发一个 gwt 应用程序 其中涉及对日期时间的高级操作 从一个时区转换到另一个时区等 Gwt 有一些用于处理日期的低级内容 但它们对我来说太低级了 gwt 是否有类似于 joda time 或 Threeten 的选项 您可以查看以
  • 如何获取 Python OrderedDict 中的前 3 个元素?

    如何获取 Python OrderedDict 中的前 3 个元素 也可以从该字典中删除数据 例如 如何获取 Python OrderedDict 中的前 3 个元素并删除其余元素 让我们创建一个简单的OrderedDict gt gt g
  • Angular2 模板解析错误:嵌入模板上的任何指令均未使用属性绑定 ngFor

    这是 Angular2 模板
  • iPad Safari 忽略 html5 视频上方的 div onclick

    我在使 div 元素可点击时遇到问题 我在屏幕上有一个 HTML5 视频 在视频结束事件之后 我使用 z index 属性创建了一些位于视频上方的 div 元素 录制这个 div 时没有任何反应 但如果这个 div 不位于视频上方 则一切正
  • Java图形库[重复]

    这个问题在这里已经有答案了 我一直在这里寻找对用于图形可视化表示的 java 库的任何引用 但我只找到了直方图 饼图等的库 我正在寻找一个图形库 带有顶点 节点等的图形库 任何人都可以推荐吗 我会和JUNG http jung source
  • 开发人员如何制作 iOS Simulator 动画 .gif? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我经常在 GitHub 上看到很多这样的内容 如何重现这个 gif 动画效果 https github com autresphere A
  • 如何使 Dart 对象/类可索引?

    在Python中 我可以通过覆盖使任何类支持索引 getitem 像这样 class Test def getitem self key return self data key Dart 是否有类似的构造 假设 getitem thing
  • 如何查看哪些查询正在使用 MongoDB 中的索引?

    我看到 MongoDB 正在使用索引 但我不确定哪些查询正在使用它 如何查看哪些查询正在使用索引 编辑 为了澄清 我想看看哪个查询使用索引 而不是相反使用explain查看特定查询使用了哪些索引 您可以运行您的查询 解释 https doc
  • WinForm 滚动查看器

    我在 WPF 中有一个使用 ScrollViewr 的应用程序 我想将其移植到 WinForms WinForms 是否有等效的控件 Reason WPF 程序很慢 我似乎无法学习如何正确渲染程序 GameOfLife 代码
  • pdfMake - 无法打开文件

    我在 Nodejs 上使用了这个模块 https github com bpampuch pdfmake https github com bpampuch pdfmake 这是我创建它的代码 const fonts Roboto norm
  • C++11接口纯虚析构函数

    UPD 有一个标记表明它是重复的这个问题 https stackoverflow com questions 11494422 default pure virtual destructor 但在这个问题中 OP询问如何使用default定