为什么我不能用'= delete;'声明一个纯虚函数?
Why can't I declare a pure virtual function with `= delete;`?
简介
纯虚拟函数使用通用语法进行建模:
virtual f() = 0;
然而,由于c++11,有一种方法可以传递(特殊(成员函数的显式non existence
:
Mystruct() = delete; // eg default constructor
Q
为什么不将这种语法扩展到纯虚拟函数,以便在通信此类操作时实现一致性?:
virtual f() = delete;
备注
我知道显而易见的答案是because the Standard says so!
。我想知道这背后的原因,以及是否有这样的提议(或意图(。
粗略地说,区别在于:
virtual void f() = 0;
说"这个类是抽象的,我可能还没有编写这个成员函数的实现"(尽管允许您这样做(。
然而,这:
void f() = delete;
说"这个成员函数实际上不存在,没有一个通过。">
= delete;
的意思与使函数成为纯虚拟函数完全不同。与已删除的函数不同,纯虚拟函数不会使选择它作为过载解决结果的程序格式不正确。
这两件事的含义有很大的不同。粗略地说,不同之处在于:
virtual void f() = 0;
说";我可能还没有编写这个函数的实现">
然而:
f() = delete;
说";编译器注意:不要创建此函数的实现">
有一些自动生成的成员函数:默认构造函数、析构函数、复制构造函数、赋值,还有一些新的移动构造函数。
能够delete
它们的目的是确保编译器不允许调用它们。老把戏是将它们声明为private
,而不给它们一个实现。
这很麻烦,但值得注意的是,它并没有完全阻止调用它们,因为朋友类(甚至类本身(可能会意外调用副本或赋值,尽管你会遇到链接器错误,但这并不理想,因为你看不到错误在哪里,而且你真的想要一个编译器错误。
用=0
将函数声明为虚拟函数不会阻止调用该函数。它有一个特殊的意义,使你的类抽象,所以你不能创建一个实例,这意味着该函数不需要实现,但它有不同于删除它的意义。
相关文章:
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何仅为一个函数添加延迟
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 我需要将多个函数组合为一个函数
- 在C++中声明一个函数时,它需要有函数本身的参数吗
- 如何创建一个函数来计算并返回平均值、最大值和最小值
- 一个函数,用于查找字符串1包含字符串2 c++的次数
- 如何将一个类的函数作为另一个类的另一个函数的参数传递
- 编写一个函数以使用 n 百分比的 CPU 使用率
- 将 N-arg 函数包装到另一个函数中
- 如何封装一个函数,以便它只能由同一类中的一个其他函数调用?
- C++(.cpp文件和.h文件)拆分代码并添加一个函数,提取 - 这很容易吗?
- C++从另一个函数退出函数
- 编写一个函数来删除单链表中的节点(尾部除外),仅授予对该节点的访问权限
- 视觉我希望一个函数在另一个函数C++中进行计算
- C ++如何在原始抽象类中创建一个函数,该函数接受派生类的输入
- 在另一个函数 (c++) 中调用变量
- 如何在另一个函数中使用返回值作为参数?
- 如何包装一个函数以适应另一个函数的所需类型
- 创建一个函数的 Python 绑定,返回指向带有 boost 的向量的指针