class Foo
{
public:
virtual int foo() final = 0;
};
编译通过。
Foo
只是浪费空间,并且可能是一个意外吗?还是我有所遗漏?
class Foo
{
public:
virtual int foo() final = 0;
};
编译通过。
Foo
只是浪费空间,并且可能是一个意外吗?还是我有所遗漏?
正如您所说,这几乎是完全浪费空间。但是至少有一个明显的用途。顺便说一句,它能编译通过并不奇怪。只要代码是合法的,它就不需要“有意义”才能编译。
假设您想将 Foo
用作策略。这意味着它将被用作模板参数,但不需要被实例化。实际上,您真的不希望任何人实例化该类(尽管我不知道为什么,因为它有什么影响)。
这正是您在这里拥有的东西。一个具有类型的类,但您无法实例化它(虽然将构造函数设置为私有可能会更加简单直接)。
额外的好处是,您可以在类范围内添加enum
或静态函数。这些功能可以在不实例化的情况下使用,并且它们将位于该类的命名空间中。 因此,您拥有一个主要仅用作类型的类,但仍然以静态函数的形式捆绑了“一些功能”。
大多数情况下,人们可能只需将这些内容包装到命名空间中,但谁知道,在某些情况下,这可能是所需的方式。
Foo只是浪费空间吗?
确实是这样的;由于它是抽象的,你无法实例化它,也无法重写函数去创建一个非抽象的派生类。
如果你想要阻止一个类被实例化,它可以被用作一种方式;但即使如此,删除默认构造函数可能更有意义。
那么这不是一个错误的制作吗?
不完全是。由于你无法对该类做任何操作,因此你不会做出任何错误的行为。
dynamic_cast
,你需要一个 vptr,而foo()
确保了这一点。 - ipc