没有任何纯粹的虚拟方法来创build一个类的抽象
我有一个听老鼠事件的课。 但是,我不想强迫用户执行任何特定的操作,但是我想清楚地表明它们必须inheritance它。
有没有办法做到这一点?
谢谢
你可以声明一个纯粹的虚拟析构函数,但给它一个定义。 该类将是抽象的,但任何inheritance类不会默认为抽象的。
struct Abstract { virtual ~Abstract() = 0; }; Abstract::~Abstract() {} struct Valid: public Abstract { // Notice you don't need to actually overide the base // classes pure virtual method as it has a default }; int main() { // Abstract a; // This line fails to compile as Abstract is abstract Valid v; // This compiles fine. }
指定基础的构造函数为protected。 这意味着你不能直接构造它,而是强制inheritance。 除了良好的文档,没有什么能够让开发者inheritance这个类。
你可以声明你的基类有一个你实现的纯虚拟析构函数。 由于析构函数总是由编译器提供的,派生类不是纯虚拟的,但是基类不能直接实例化。 正如你应该总是声明一个虚拟析构函数,如果你的类有一个虚拟的方法,这不会产生任何代价。
class Base { public: virtual ~Base() = 0; virtual void SomeVirtualMethod(); }; inline Base::~Base() { } class Derived : public Base { }; inline Base* createBase() { // return new Base; // <- This won't compile return new Derived; // <- This compile, Derived is not a pure virtual class ! }
为什么你要用户inheritance,如果他不需要实现任何东西。
当基类需要能够把所有的“事件处理程序”放在一个std :: set。 那么没有人可以创build一个类,并把它放在这个集合中,而不需要inheritance你的基类。 因为该集合将被定义为
std::set<MyBaseClass*> mySet;
根据定义,抽象类是一个至less有一个纯虚函数的类。 为了您的目的,您可以将析构函数定义为纯虚拟的,并提供一个实现:
class abstract { virtual ~abstract()=0; }; abstract::~abstract() {}
默认情况下,即使不需要实现任何方法,所有inheritance类也不会是抽象的。