音樂蟲子
Posted @ 2006-05-03 23:42
更正摟主的一個說法,“鏈?zhǔn)秸{(diào)用”不是virtual才可以的,析構(gòu)函數(shù)本來就是鏈?zhǔn)秸{(diào)用!正確的說法是virtual的析構(gòu)函數(shù)和一般的virtual函數(shù)一樣,使得調(diào)用的是真正對象的函數(shù)。
例子代碼演示就算析構(gòu)函數(shù)不是virtual的情況下,派生類和基類的析構(gòu)函是依然被鏈?zhǔn)秸{(diào)用了。但是,當(dāng)指針是base的時候它不能從正確的析構(gòu)函數(shù)開始:
using namespace std;
class Base
{
public:
~Base()
{
cout << "base\n";
}
};
// derived class
class Derived : public Base
{
public :
~Derived()
{
cout << "derived\n";
}
};
int _tmain(int argc, _TCHAR* argv[])
{
Derived* d = new Derived;
delete d;
Base* b = new Derived;
delete b;
return 0;
}
把基類修改成:
class Base
{
public:
virtual ~Base()
{
cout << "base\n";
}
};
之后,就可以正確從派生類(真正的對象)開始調(diào)用析構(gòu)函數(shù)
回復(fù)更多評論