有没有办法在 C++ 中将基类显式声明为抽象?
我知道我可以在类中创建一个纯虚函数,它将隐式地将一个类声明为抽象类。但是,我不想仅仅为了在派生类中定义而创建一个虚拟函数。
我还可以使构造函数受保护,这将阻止对象的实例化,但这实际上并没有将类标记为抽象类。
那么,有没有办法做到这一点?(我正在使用 C++11,如果这增加了一种方法来做到这一点,但我没有找到任何看起来正确的东西)
有没有办法在 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++ 中将基类显式声明为抽象?
不,那里没有。一个类只有在其中声明了至少一个抽象方法时才是抽象的。如果您不希望直接实例化您的基类,那么受保护的构造函数是一个不错的选择。