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

编译良好。

Foo只是浪费空间,而且正在制造事故吗?还是我错过了什么?

4

3 回答 3

16

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

假设您想Foo用作策略。这意味着它将用作模板参数,但不需要实例化。实际上,您真的不希望任何人实例化该类(尽管我承认我不知道为什么,这会造成什么伤害)。

这正是您在这里所拥有的。一个类,其类型您可以使用,但您不能实例化它(尽管将构造函数设为私有可能会更直接)。

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

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

于 2012-12-14T15:08:48.737 回答
9

Foo 不只是浪费空间吗

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

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

和正在发生的事故?

并不真地。既然你不能对这个类做任何事情,你就不能对它做任何错事。

于 2012-12-14T14:47:33.373 回答
4

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

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

然后它表明virt-specifier-seq可以是final并且pure-specifier= 0

我看不出这有什么用处,尽管可能有一些角落案例可以利用它。

于 2012-12-14T14:55:39.177 回答