虚析构函数
我要把最重要的这句话放在前面:
除非你知道自己在做什么,否则只要有子类的基类,基类析构函数都加上 virtual
举个栗子
看这样一个代码
class Father { private: /* data */ public: Father(/* args */); ~Father(); void fun() { cout<<"Father fun"<<endl; } }; Father::Father(/* args */) { } Father::~Father() { cout<<"Father boom"<<endl; } class Child:public Father { private: /* data */ public: Child(/* args */); ~Child(); void fun() { cout<<"Child fun"<<endl; } }; Child::Child(/* args */) { } Child::~Child() { cout<<"Child boom"<<endl; } int main() { Father *p = new Child; p->fun(); delete p; return 0; }
后面delete掉的时候,自然是父类和子类都要释放,但是执行结果却是这样的
Child fun
Father boom
没有执行子类的析构函数
所以我们在父类的析构函数定义为虚析构函数
class Father { private: /* data */ public: Father(/* args */); virtual ~Father(); virtual void fun() { cout<<"Father fun"<<endl; } };
这样再重新执行代码
Child fun
Child boom
Father boom
如果继承的父类的子类有同名函数,那么要看这个指针类型,指针是父类类型的,就调用父类的函数