纯虚拟的final函数:在C++11中是合法的

pure virtual final functions : legal in C++11

本文关键字:C++11 虚拟 final 函数      更新时间:2023-10-16
class Foo
{
public: 
virtual int foo() final = 0;
};

编译良好。

Foo不就是在浪费空间吗?还是我错过了什么?

正如您所说,这几乎是完全浪费空间。至少有一个公认的忏悔用法。顺便说一句,它的编译并不令人惊讶。只要代码是合法的,编译就不需要"有意义"。

假设您要将Foo用作策略。这意味着它将被用作模板参数,但不需要实例化。事实上,你真的不希望任何人实例化这个类(尽管无可否认,我不知道为什么,这会有什么害处)。

这正是你在这里所拥有的。一个类,它的类型可以随意使用,但不能实例化它(尽管将构造函数设为私有可能会简单得多)。

作为额外的奖励,您可以在类范围内添加enum或静态函数。这些可以在没有实际实例化的情况下使用,并且它们将在该类的命名空间中。因此,您有一个主要只能作为类型使用的类,但仍有以静态函数形式捆绑的"一些功能"。

大多数时候,人们可能只是将这些东西包装到一个名称空间中,但谁知道呢,在某些情况下,这可能是想要的方式。

Foo不是在浪费的空间吗

确实如此;不能实例化它,因为它是抽象的,也不能重写函数来生成非抽象派生类。

如果您出于某种原因想要实例化类,那么它可以被用作防止类被实例化的一种方法;但即便如此,删除默认构造函数可能更有意义。

和正在发生的事故?

不是。既然你不能对这个类做任何事情,你就不能对它做任何错误。

如果我正确阅读了9.2中的语法,这实际上是合法的,尽管我可能在注释中遗漏了禁止它的内容。

成员声明符:声明符virt说明符seq(opt)纯说明符(opt

则表明virt-specifier-seq可以是finalpure-specifier= 0

我看不出这有任何用处,尽管可能有一些角落的情况可以利用它