2

有没有办法在 C++ 中将基类显式声明为抽象?

我知道我可以在类中创建一个纯虚函数,它将隐式地将一个类声明为抽象类。但是,我不想仅仅为了在派生类中定义而创建一个虚拟函数。

我还可以使构造函数受保护,这将阻止对象的实例化,但这实际上并没有将类标记为抽象类。

那么,有没有办法做到这一点?(我正在使用 C++11,如果这增加了一种方法来做到这一点,但我没有找到任何看起来正确的东西)

4

3 回答 3

3

您可以使析构函数成为纯虚拟的。因为你总是需要一个析构函数,所以没有额外的心理成本:

struct Foo
{
    virtual ~Foo() = 0;
};

inline Foo::~Foo() { }

(你当然需要析构函数的实现,所以你必须提供一个外线。)

您仍然可以制作析构函数protected,这是遵循“使非叶类抽象”规则的好习惯。

例子:

struct Bar : Foo  { };

// Foo f;  // Error, Foo is abstract
Bar b;     // OK
于 2012-11-14T02:22:42.530 回答
1

我喜欢Kerrek的回答。这样类就不能被实例化,因此是抽象的。

但是,除非您扫描类的整个声明并看到析构函数是虚拟的,否则仍不清楚该类是抽象的。

我的另一个想法是,您可以使用#define. 这样,您可以执行以下操作:

abstract struct Foo {};

这与

struct Foo {};

我看到的问题是这不会强制类是抽象的,因此您可以使用宏来声明虚拟析构函数。就像是:

#define ABSTRACT_CLASS(class_name) \
  class class_name { \
    virtual ~class_name() = 0; //

然后像这样使用它:

ABSTRACT_CLASS(Foo) {
  // class declaration
};

这将变成:

class foo {
  virtual ~class_name() = 0; // {
  // class declaration
};

免责声明:我的宏可能略有偏差。我不确定它是否真的会粘贴带有 ~ 的 class_name 和 () 触摸变量名。另外,我不确定自己是否会这样做,这不是最漂亮的解决方案,尤其是注释掉大括号,因为如果将其放在下一行,那将不起作用。但是您问如何将某些内容标记为抽象,我给了您!

于 2012-11-14T02:30:16.637 回答
0

有没有办法在 C++ 中将基类显式声明为抽象?

不,那里没有。一个类只有在其中声明了至少一个抽象方法时才是抽象的。如果您不希望直接实例化您的基类,那么受保护的构造函数是一个不错的选择。

于 2012-11-14T02:25:08.487 回答