因?yàn)楹芏囝?lèi)并不是被設(shè)計(jì)作為基類(lèi)的。只有類(lèi)在行為上是它的派生類(lèi)的接口時(shí)(這些派生類(lèi)往往在堆中分配,通過(guò)指針或引用來(lái)訪問(wèn)),虛擬函數(shù)才有意義。
那么什么時(shí)候才應(yīng)該將析構(gòu)函數(shù)定義為虛擬呢?當(dāng)類(lèi)至少擁有一個(gè)虛擬函數(shù)時(shí)。擁有虛擬函數(shù)意味著一個(gè)類(lèi)是派生類(lèi)的接口,在這種情況下,一個(gè)派生類(lèi)的對(duì)象可能通過(guò)一個(gè)基類(lèi)指針來(lái)銷(xiāo)毀。例如:
class Base {
// ...
virtual ~Base();
};
class Derived : public Base {
// ...
~Derived();
};
void f()
{
Base* p = new Derived;
delete p; // 虛擬析構(gòu)函數(shù)保證~Derived函數(shù)被調(diào)用
}
如果基類(lèi)的析構(gòu)函數(shù)不是虛擬的,那么派生類(lèi)的析構(gòu)函數(shù)將不會(huì)被調(diào)用——這可能產(chǎn)生糟糕的結(jié)果,例如派生類(lèi)的資源不會(huì)被釋放。
那么什么時(shí)候才應(yīng)該將析構(gòu)函數(shù)定義為虛擬呢?當(dāng)類(lèi)至少擁有一個(gè)虛擬函數(shù)時(shí)。擁有虛擬函數(shù)意味著一個(gè)類(lèi)是派生類(lèi)的接口,在這種情況下,一個(gè)派生類(lèi)的對(duì)象可能通過(guò)一個(gè)基類(lèi)指針來(lái)銷(xiāo)毀。例如:
class Base {
// ...
virtual ~Base();
};
class Derived : public Base {
// ...
~Derived();
};
void f()
{
Base* p = new Derived;
delete p; // 虛擬析構(gòu)函數(shù)保證~Derived函數(shù)被調(diào)用
}
如果基類(lèi)的析構(gòu)函數(shù)不是虛擬的,那么派生類(lèi)的析構(gòu)函數(shù)將不會(huì)被調(diào)用——這可能產(chǎn)生糟糕的結(jié)果,例如派生類(lèi)的資源不會(huì)被釋放。