class Foo
{
public:
virtual int foo() final = 0;
};
编译好。
Foo
不是浪费空间,而是制造事故吗?或者我错过了什么?
答案 0 :(得分:14)
假设您要使用Foo
作为政策。这意味着它将用作模板参数,但不需要实例化。事实上,你真的不希望任何人实例化这个类(虽然我不知道为什么,它会伤害什么)。
这正是你在这里所拥有的。一个类,你可以把手放在一个类,但你不能实例化它(虽然使构造函数私有可能会更直接)。
作为额外的好处,您可以在类范围内添加enum
或静态函数。这些可以在没有实际实例化的情况下使用,并且它们将在该类的命名空间内。所以,你有一个主要仅作为类型使用的类,但你仍然以静态函数的形式与它捆绑了“某些功能”。
大多数情况下,人们可能只是将这些内容包装到命名空间中,但谁知道,在某些情况下,这可能是理想的方式。
答案 1 :(得分:9)
确实是这样的;你不能实例化它,因为它是抽象的,你不能覆盖函数来创建一个非抽象的派生类。不是Foo只是浪费空间
如果你想出于某种原因这样做,它可以用来防止类被实例化;但即便如此,删除默认构造函数可能更有意义。
并且正在制造事故?
不是真的。由于你不能对班级做任何事情,你不能对它做任何错误。
答案 2 :(得分:4)
如果我正确地阅读9.2中的语法,这实际上是合法的,尽管我可能已经错过了禁止它的注释。
构件声明符: declarator virt-specifier-seq(opt)pure-specifier(opt)
然后它显示virt-specifier-seq
可以是final
而pure-specifier
是= 0
我看不出任何有用的方法,尽管可能会有一些利用它的角落案例。