显式声明抽象基类



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

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

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

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

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

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

(当然,您确实需要析构函数的实现,所以您必须提供一个不符合要求的实现。)

您仍然可以使析构函数protected,这是遵循"使非叶类抽象"规则的好做法。

示例:

struct Bar : Foo  { };
// Foo f;  // Error, Foo is abstract
Bar b;     // OK

我喜欢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,其中~和()触摸变量名。此外,我不确定我是否会自己这样做,这不是最漂亮的解决方案,尤其是注释掉支架,因为如果你把它放在下一行,那就行不通了。但你问我怎么能把东西标记成抽象的,我给了你!

有没有一种方法可以在C++中将基类显式声明为抽象类?

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

最新更新