纯虚拟的final函数:在C++11中是合法的
pure virtual final functions : legal in C++11
class Foo
{
public:
virtual int foo() final = 0;
};
编译良好。
Foo
不就是在浪费空间吗?还是我错过了什么?
正如您所说,这几乎是完全浪费空间。至少有一个公认的忏悔用法。顺便说一句,它的编译并不令人惊讶。只要代码是合法的,编译就不需要"有意义"。
假设您要将Foo
用作策略。这意味着它将被用作模板参数,但不需要实例化。事实上,你真的不希望任何人实例化这个类(尽管无可否认,我不知道为什么,这会有什么害处)。
这正是你在这里所拥有的。一个类,它的类型可以随意使用,但不能实例化它(尽管将构造函数设为私有可能会简单得多)。
作为额外的奖励,您可以在类范围内添加enum
或静态函数。这些可以在没有实际实例化的情况下使用,并且它们将在该类的命名空间中。因此,您有一个主要只能作为类型使用的类,但仍有以静态函数形式捆绑的"一些功能"。
大多数时候,人们可能只是将这些东西包装到一个名称空间中,但谁知道呢,在某些情况下,这可能是想要的方式。
Foo不是在浪费的空间吗
确实如此;不能实例化它,因为它是抽象的,也不能重写函数来生成非抽象派生类。
如果您出于某种原因想要实例化类,那么它可以被用作防止类被实例化的一种方法;但即便如此,删除默认构造函数可能更有意义。
和正在发生的事故?
不是。既然你不能对这个类做任何事情,你就不能对它做任何错误。
如果我正确阅读了9.2中的语法,这实际上是合法的,尽管我可能在注释中遗漏了禁止它的内容。
成员声明符:声明符virt说明符seq(opt)纯说明符(opt
则表明virt-specifier-seq
可以是final
,pure-specifier
是= 0
我看不出这有任何用处,尽管可能有一些角落的情况可以利用它
相关文章:
- 虚拟决赛作为安全
- C++11 中默认纯虚拟析构函数的正确放置
- C++11 纯虚拟类的朋友无法访问私有方法
- GCC:当层次结构中存在虚拟继承时,C++11 内联对象初始化(使用 "this")不起作用
- 此constexpr虚拟功能技术是否违反了任何C 11/C 14规则
- C++11接口纯虚拟析构函数
- 纯虚拟的final函数:在C++11中是合法的
- 在 C++11 中实现虚拟方法条件
- 在 C++11 中同时使用虚拟关键字和覆盖关键字是否有任何细微之处
- C++11 非模板化基类中的纯虚拟'templated'返回类型
- C++11:使用中央命令映射器调用虚拟基类方法
- NDK:0xdeadd00d时虚拟机中止和致命信号 11 (SIGSEGV) 的问题(代码 = 1)
- C++11 中默认虚拟析构函数的异常规范是什么?
- C++11 标准::功能比虚拟调用慢
- 重写 C++11 中的<<运算符、基类中的纯虚拟以及每个派生类中的不同实现
- c++11中虚拟类的另一种构造方法
- C++ 11 个委托构造函数 纯虚拟方法和函数调用 -- 危险?
- C++11虚拟模板方法或转发可变模板
- 使用具有纯虚拟线程函数的 C++11 线程
- C++11 中具有虚拟成员的虚拟析构函数