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