繁体   English   中英

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

[英]pure virtual final functions : legal in C++11

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

编译好。

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

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

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

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

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

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

不是Foo只是浪费空间

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

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

和制造中的意外?

并不是的。 由于你无法对课程做任何事情,你不能对它做任何错误。

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

member-declarator:declarator virt-specifier-seq(opt)pure-specifier(opt)

然后它表明virt-specifier-seq可以是finalpure-specifier= 0

虽然可能有一些利用它的角落情况,但我看不出任何有用的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM