关于virtual function的作用我就不再赘述了。总之,就是让子类可以重新定义一个和基类同名的函数,并且不用考虑会把基类的覆盖掉。
我原先以为 virtual destructor根virtual function一样,就是如果你不加virtual的话,那么derived class中的destructor就会把base class给覆盖了,结果发现,你不加virtual的话,根本就看不到derived class的destructor
考虑下面代码:
#include iostream.h class Base { public: Base(){ cout<<"Constructing Base";} // this is a destructor: ~Base(){ cout<<"Destroying Base";} }; class Derive: public Base { public: Derive(){ cout<<"Constructing Derive";} ~Derive(){ cout<<"Destroying Derive";} }; void main() { Base *basePtr = new Derive(); delete basePtr; }输出结果是:
Constructing Base Constructing Derive Destroying Base
坑爹啊,derived class根本就看不到自己的destructor,这个跟普通虚函数是反着的。普通虚函数是如果你不加virtual,那我的派生类的同名函数就把基类的给覆盖了。但是destructor是只看得到祖宗的,看不到自己的。
我发现真是越复习越发现自己原先理解的不对。其实这个跟普通virtual function不冲突,因为basePtr是一个基类的指针,所以按理说他只能看到自己类里的成员函数,所以如果你不加virtual的话,那只能看到基类的destructor,从而无法访问derived class的destructor。所以要有virtual destructor。 这样基类指针就能看到derived class的destructor