1. 程式人生 > >C++ 虛解構函式 虛建構函式

C++ 虛解構函式 虛建構函式

建構函式不能為虛的,是因為它是構造物件的入口,虛擬函式的存在方式是一張虛表,虛表是附在物件上的,

也就是物件才會有序表地址,建構函式是物件的入口,因此如果建構函式為虛的那麼物件是無法構造的

解構函式可以為虛的常常必須為虛的,否則會造成不一察覺的洩露

建構函式與解構函式不會發生動態捆綁,只有成員的“本地”版本被呼叫。所以即使在基類中呼叫其它可以動態繫結的函式也不會呼叫子類中的函式

例:

class Base1{
public:
~Base1(){ std::cout << "Base1" << std::endl; }
};
class Derived: public Base1 {
public:
~Derived() { std::cout << "Derived" << std::endl; }
};


int main()
{
Base1 *pBase = new Derived();
delete pBase;
return 0;
}

每個類會知道自己的父類,但是父類卻不一定知道自己有幾個派生類

在delete時呼叫時,編譯器會呼叫型別Base1的解構函式,之後不會再呼叫Derived,這時如果派生類有些釋放沒有做,就會造成記憶體洩漏

如果將基類的解構函式設定為虛的,則會呼叫子類析構,子類析構會自動呼叫父類析構。

如果基類是個介面的話:其解構函式通常為純虛的