C++基類的析構函數定義為虛函數的原因


1:每個析構函數只會清理自己的成員(成員函數前沒有virtual)。
2:可能是基類的指針指向派生類的對象,當析構一個指向派生類的成員的基類指針,這時程序不知道這么辦,可能會造成內存的泄露,因此此時基類的析構函數要定義為虛函數;
基類指針可以指向派生類的對象(多態),如果刪除該指針delete[]p,就會調用該指針指向的派生類的析構函數,而派生類的對象又會自動調基類的成員函數,這樣就會把派生類的對象釋放,如果基類的析構函數沒有定義成虛函數,則編譯器實現的靜態綁定,在刪除基類的指針,只會釋放基類的析構函數而不會釋放派生類的成員函數,此時會導致釋放內存不完全,就會導致內存泄露的問題。
一:派生類指針指向派生類的對象

class Base
{
public: Base()
{ cout << "Base()" << endl; }

virtual ~Base()
{
cout << "~Base()" << endl;
}
};
class Driver :public Base
{
public: Driver()
{
cout << "Driver()" << endl;
}
~Driver()
{
cout << "~Driver()" << endl;
}
};
void Test()
{
Driver*pd = new Driver;
delete pd;
}

結果:

base()

Driver()

~Driver()

~Base()

 

派生的指針指向派生類的對象,釋放p的過稱是先釋放派生類的析構函數,再釋放基類的析構函數
二:基類的指針指向派生類的對象(無virtual)

class Base 
{

public: Base()
{
cout << "Base()" << endl;
}
~Base()
{
cout << "~Base()" << endl;
}
};

class Driver :public Base
{

public: Driver()
{
cout << "Driver()" << endl;
}
~Driver()
{
cout << "~Driver()" << endl;
}
};
void Test()
{
Base *pd = new Driver;
delete pd;
}

運行結果:

Base()

Driver()

~Basce()

當基類的指針指向派生類的對象的成員,釋放pd的過程是:只是釋放了基類的資源,而沒有調用派生類的析構函數;這樣的刪除只能刪除基類對象,而不能刪除派生類的對象,造成內存泄露;
在公有繼承中,基類對派生類的對象的操作,只能影響哪些繼承的成員,如果想要基類對非繼承進行操作,則要把這個基類函數定義為虛函數;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM