為了永遠記住析構函數聲明virtual----><<effective c++>>
為這句話不一定對,但無需質疑的是這句話是非常實用的.
查看以下的樣例:
#include <iostream>
#include <string>
using namespace std;
class B{
public:~B(){cout<<"base is destroyed!"<<endl;}
};
class D:public B{
public:~D(){cout<<"dirved is destroyed!"<<endl;}};int main(){{D d;}
}
這個是一個非常easy的樣例,輸出是肯定的.
可是,再看以下的測試!
#include <iostream>
#include <string>
using namespace std;
class B{
public:~B(){cout<<"base is destroyed!"<<endl;}
};
class D:public B{
public:~D(){cout<<"dirved is destroyed!"<<endl;}};int main(){{B *b=new D();delete b;}
}
因此能夠看到,當用一個基類的指針指向一個派生類的對象,直接刪除該指針時,析構函數調用鏈將會遭到破壞.
#include <iostream>
#include <string>
using namespace std;
class B{
public:virtual ~B(){cout<<"base is destroyed!"<<endl;}
};
class D:public B{
public:virtual ~D(){cout<<"dirved is destroyed!"<<endl;}};int main(){{B *b=new D();delete b;}
}
因此應該記得將析構函數聲明為virtual,這樣就永遠不用操心析構函數調用鏈的破壞!
版權聲明:本文博主原創文章,博客,未經同意不得轉載。