明确声明抽象基类

时间:2012-11-14 02:20:56

标签: c++ abstract-class

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

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

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

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

3 个答案:

答案 0 :(得分:3)

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

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

inline Foo::~Foo() { }

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

你仍然可以制作析构函数protected,这是遵循“make non-leaf classes abstract”规则的好习惯。

示例:

struct Bar : Foo  { };

// Foo f;  // Error, Foo is abstract
Bar b;     // OK

答案 1 :(得分:1)

  

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

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

答案 2 :(得分:1)

我喜欢Kerrek的回答。这样,该类无法实例化,因此是抽象的。

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

我的另一个想法是你可以使用#define为“abstract”创建一个预处理器定义。通过这种方式,您可以执行以下操作:

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。另外,我不确定自己是否会这样做,这不是最美丽的解决方案,尤其是评论大括号,因为如果你把它放在下一行就行不通。但是你问你如何将某些东西标记为抽象而我把它给了你!