纯虚函数最终函数:C ++ 11中的合法函数

时间:2012-12-14 14:35:48

标签: c++ c++11 final pure-virtual

class Foo
{
public: 
    virtual int foo() final = 0;
};

编译好。

Foo不是浪费空间,而是制造事故吗?或者我错过了什么?

3 个答案:

答案 0 :(得分:14)

正如你所说,几乎完全浪费了空间。至少有一个公认的用途。顺便说一句,它编译的事实并不令人惊讶。只要代码是合法的,编译就不需要“有意义”。

假设您要使用Foo作为政策。这意味着它将用作模板参数,但不需要实例化。事实上,你真的不希望任何人实例化这个类(虽然我不知道为什么,它会伤害什么)。

这正是你在这里所拥有的。一个类,你可以把手放在一个类,但你不能实例化它(虽然使构造函数私有可能会更直接)。

作为额外的好处,您可以在类范围内添加enum或静态函数。这些可以在没有实际实例化的情况下使用,并且它们将在该类的命名空间内。所以,你有一个主要仅作为类型使用的类,但你仍然以静态函数的形式与它捆绑了“某些功能”。

大多数情况下,人们可能只是将这些内容包装到命名空间中,但谁知道,在某些情况下,这可能是理想的方式。

答案 1 :(得分:9)

  

不是Foo只是浪费空间

确实是这样的;你不能实例化它,因为它是抽象的,你不能覆盖函数来创建一个非抽象的派生类。

如果你想出于某种原因这样做,它可以用来防止类被实例化;但即便如此,删除默认构造函数可能更有意义。

  

并且正在制造事故?

不是真的。由于你不能对班级做任何事情,你不能对它做任何错误。

答案 2 :(得分:4)

如果我正确地阅读9.2中的语法,这实际上是合法的,尽管我可能已经错过了禁止它的注释。

  

构件声明符:   declarator virt-specifier-seq(opt)pure-specifier(opt)

然后它显示virt-specifier-seq可以是finalpure-specifier= 0

我看不出任何有用的方法,尽管可能会有一些利用它的角落案例。