【问题标题】:Make a class that cannot be instantiated?制作一个无法实例化的类?
【发布时间】:2017-10-13 15:25:33
【问题描述】:

假设我有一个班级Bar。我想将Bar 唯一地用作基类,例如:

class Foo : public Bar

我想禁止 Bar 被实例化。换句话说,我希望Bar object; 是一个错误。这可以吗?

【问题讨论】:

  • 受保护的构造函数?让它成为一个抽象类?
  • 将条形抽象化?
  • 抽象意味着定义一个纯虚函数(例如virtual void fizz() = 0;)对吗?我不想这样做,因为我没有用例来拥有这样的功能。
  • 是的,您确实有这样一个功能的用例。您的用例是“防止您的类被实例化”。无论如何,如果您将纯虚函数设为私有,那么没人会知道您拥有它。它将在您和编译器之间。
  • 使用受保护的构造函数会更干净吗?例如。 class Foo { protected: Foo(); }

标签: c++ class oop c++11 inheritance


【解决方案1】:

这是可能的。您实际上是在问,如何制作一个类抽象

在其他一些语言中,有一个说明符关键字可用于声明类抽象,但在 c++ 中则不行。在 C++ 中,如果一个类至少有一个纯虚成员函数,那么它就是抽象类。

几乎总是,抽象类自然有一个纯虚函数供派生类实现,但如果你的基类没有,有一个技巧:将抽象类的析构函数声明为纯虚函数。

PS。请注意,与其他纯虚函数不同,析构函数必须始终具有定义。

【讨论】:

  • protected 构造函数?
  • 受保护的构造函数是实现不可实例化的更清洁/等效的方式吗?
  • @πάνταῥεῖ 不会阻止子类将父类的实例构造为非基础子对象。现在,我不知道为什么这很重要,但这就是我理解的要求。
  • @space_voyager 还要澄清一下:所有纯虚函数都可以有定义。这有时对于接口的“规范”定义很有用。析构函数的不同之处在于它必须有一个定义。
  • @space_voyager 有时您可以将内存映射到一个对象(我不考虑这是好还是坏的做法),而 vtables 很可能会阻止此类功能。
猜你喜欢
  • 2020-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-31
  • 2019-01-25
  • 2016-12-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多