C++ 解構函式 為何一般定義為虛函數,例子:
#include <iostream>using namespace std;class Animal{public:Animal(){cout << "Animal::Animal() is called" << endl;};virtual ~Animal(){cout << "Animal::~Animal() is called" << endl;}virtual void eat() { cout << "Animal::eat() is called" << endl; }virtual void walk(){ cout << "Animal::walk() is called" << endl;}/* data */};class Dog : public Animal{public:Dog(int w,int h){cout << "Dog::Dog() is called" << endl;this->weight=w;this->height=h;}virtual ~Dog(){cout << "Dog::~Dog() is called" << endl;}int weight;int height;void eat(){cout<<"i eat meat"<<endl;}void walk(){cout<<"run"<<endl;}/* data */}; int main(int argc, char const *argv[]){/* code */Animal *ani= new Dog(12,23);Dog *dog=new Dog(23,34);ani->eat();ani->walk();dog->eat();dog->walk();delete ani;//delete dog;return 0;} 如果基類沒有定義為虛函數,則delete ani的時候,僅僅調用了父類的解構函式,子類的沒有調用,如果在父類和子類的建構函式中都有動態記憶體分配,那麼就會存在記憶體流失的問題。一般解構函式最好都寫成虛函數,尤其是父類。