【问题标题】:pure virtual final functions : legal in C++11纯虚最终函数:在 C++11 中合法
【发布时间】:2012-12-02 13:48:41
【问题描述】:
class Foo
{
public: 
    virtual int foo() final = 0;
};

编译正常。

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

【问题讨论】:

  • 恕我直言,在这种情况下,Foo 是一个空白。
  • 嗯,您有一个无法实例化的抽象类,但您也永远无法从中派生具体类...恭喜?
  • 我的意思是 dynamic_cast 你需要一个 vptr 而foo() 确保这一点。
  • @ipc 在什么和什么之间动态转换?
  • @onemasse:在源文件中浪费空间,因为你不能用它做任何明智的事情。

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


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 尽管,即使您确实想阻止实例化,这也是一种相当古怪的方法。删除构造函数会更清楚地表达意图。
【解决方案2】:

Foo 不就是浪费空间吗

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

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

还有一场意外?

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

【讨论】:

  • 我以为我可能会遇到指针和'->'的问题,但忘记了不能创建此类的任何对象。
【解决方案3】:

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

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

那么说明virt-specifier-seq可以是final,而pure-specifier就是= 0

我看不出这有什么用处,尽管可能有一些特殊情况可以利用它。

【讨论】:

  • 你能想出一个corner case吗?
猜你喜欢
  • 2014-01-18
  • 2016-10-13
  • 2012-04-02
  • 2023-03-27
  • 1970-01-01
  • 2011-10-10
  • 2012-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多