除了拥有纯虚函数之外,有没有办法阻止抽象基类的实例化?
我可以这样做:
class BaseFoo
{
virtual void blah() = 0;
};
class Foo : public BaseFoo
{
virtual void blah() {}
};
但我想避免使用vtable。 (根据my other question about virtual destructors)
Microsoft ATL有ATL_NO_VTABLE来实现这一目标(或者至少我认为这就是它的作用......)
答案 0 :(得分:35)
一个非常明显的方法是声明一个受保护的构造函数,并在非抽象派生类中声明公共构造函数。
这当然会将corectness的负担转移到派生类,但至少基类是受保护的。
答案 1 :(得分:5)
您可以创建受保护的构造函数
答案 2 :(得分:-4)
如果按照此处的建议制作受保护的构造函数,那么在构造派生类时,您将得到类似于“无法访问类中声明的私有成员”的错误,以及特定于您的类的其他一些信息。
如果您的基类中有纯虚方法,那么问题不在于那些是实例化的(并且当然不是实例化非抽象方法),但问题是在编译器无法解压缩时发生推断你的派生类拥有什么。那个,或者你没有拥有者就实例化了东西! (ruh roh rhaggy)
为您的基类声明一个纯虚拟析构函数,然后在外部实现它。此外,永远不要将构造函数设为私有(编辑:除非保证仅在内部使用,例如自动构建链接列表中的下一个节点)。你曾经想要的最接近(编辑:否则)是一个显式构造函数(但这是另一个主题)。
编辑:我可能已找到答案,但今天仍然无法输入。
// example.h
class A
{
A ( ) { }
virtual ~A ( ) = 0;
};
class B : public A
{
B ( ) { }
~B ( ) { }
};
// example.cpp
#include "example.h"
A::~A ( ) { }