有没有办法在C ++中将基类显式声明为抽象?
我知道我可以在类中创建一个纯虚函数,它会隐式地将类声明为抽象类。但是,我不想创建一个虚函数只是为了在派生类中定义。
我也可以使构造函数受到保护,这会阻止对象的实例化,但这实际上并不会将类标记为抽象。
那么,有没有办法做到这一点? (我正在使用C ++ 11,如果这增加了一种方法来做到这一点,但我找不到任何看起来正确的东西)
答案 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。另外,我不确定自己是否会这样做,这不是最美丽的解决方案,尤其是评论大括号,因为如果你把它放在下一行就行不通。但是你问你如何将某些东西标记为抽象而我把它给了你!