沒有虛析構函數的類是危險的
要點10、為什麽繼承一個沒有虛析構函數的類是危險的?
一個沒有虛析構函數的類意味著不能做為一個基類。如std::string, std::complex, 和 std::vector 都是這樣的。為什麽繼承一個沒有虛析構函數的類是危險的?當你公有繼承創建一個從基類繼承的相關類時,指向新類對象中的指針和引用實際上都指向了起源的對象。因為析構函數不是虛函數,所以當你delete一個這樣的類時,C++就不會調用析構函數鏈。舉個例子說明:
class A
{
public:
~A() // 不是虛函數
{
// ...
}
};
class B: public A //錯; A沒有虛析構函數
{
public:
{
// ...
}
};
int main()
{
A * p = new B; //看上去是對的
delete p; //錯,B的析構函沒有被調用
}
http://blog.csdn.net/lanbing510/article/details/4774336
沒有虛析構函數的類是危險的
相關推薦
沒有虛析構函數的類是危險的
art lex log 相關 com class 虛析構 delet 虛析構函數 要點10、為什麽繼承一個沒有虛析構函數的類是危險的? 一個沒有虛析構函數的類意味著不能做為一個基類。如std::string, std::complex, 和 std::vector 都
虛析構函數,派生類調用基類構造方法
div pub urn new turn col blog 徹底 () #include <iostream> using namespace std; class A{ public: A() { cout<<"construct A
C++中基類虛析構函數的作用及其原理分析
art 收回 顯示 就是 靜態綁定 運行 style 轉載 調用父類 虛析構函數的理論前提是 執行完子類的析構函數,那麽父類的虛構函數必然會被執行。 那麽當用delete釋放一個父類指針所實例化的子類對象時,如果沒有定義虛析構函數,那麽將只會調用父類的析構函數,而不會調用子
基類的析構函數寫成virtual虛析構函數
生命周期 amp 空間 src info 實現 virtual 大量 c++ 虛函數作用:動態綁定,實現多態效果。 場景問題: 派生類中有資源需要回收,而在編程中采用多態,由基類的指針指向派生類,則在釋放的時候,如果基類的析構函數不是virtual,則派
C++-基類的析構函數為什麽要加virtual虛析構函數(轉)
nbsp 分享圖片 spa 防止 too bsp 測試 ++i tails 知識背景 要弄明白這個問題,首先要了解下C++中的動態綁定。 關於動態綁定的講解,請參閱: C++中的動態類型與動態綁定、虛函數、多態實現 正題
虛析構函數詳解
來源 names lin 進行 main rda right 編譯 bit 1.為什麽基類的析構函數是虛函數? 在實現多態時,當用基類操作派生類,在析構時防止只析構基類而不析構派生類的狀況發生。 下面轉自網絡:源地址 http://blog.sina.com.cn/s/
4.4 C++虛析構函數
語法 net tor 應該 delete 是我 logs com iostream 參考:http://www.weixueyuan.net/view/6373.html 總結: 構造函數是不能聲明為虛函數的,析構函數可以被聲明為虛函數。 將基類的析構函數聲明為虛函
虛析構函數和protected析構函數 大發彩_票平臺租用
希望 create 銷毀 使用 拷貝構造 tro protect bad 控制 大發彩_票平臺租用地址一:【hubawl.com】狐霸源碼論壇地址二:【bbscherry.com】 虛析構函數和protected析構函數 一、虛析構函數 類型需要虛析構函數的另外一個特征 是
只有基類的析構函數需要為虛函數
可見 spa ive char dto code reserve pre div // // main.cpp // TescDtor // // Created by Jiacan Li on 6/16/17. // Copyright ©
條款7:為多態基類析構函數聲明為virtual
是你 避免 class 基類 多態 聲明 ase delet 必須 基類指針指向子類對象。 子類對象必須位於堆。因此為了避免泄漏內存資源,當指針不使用時,delete掉每一個對象非常重要。但是如果基類的析構函數不聲明為virtual。那麽指向子類對象的指針delete時,析
1、構造函數和析構函數為什麽沒有返回值?
問題 目前 ons tab 臨時 turn wid 構造 情況 構造函數和析構函數是兩個非常特殊的函數:它們沒有返回值。這與返回值為void的函數顯然不同,後者雖然也不返回任何值,但還可以讓它做點別的事情,而構造函數和析構函數則不允許。在程序中創建和消除一個對象的行為非常特
C++基類和派生類的構造函數和析構函數的調用
str 生命 ons stream all 兩種 col 生命期 析構函數 C++基類和派生類的構造函數和析構函數的調用 1.調用順序 當創建一個派生類的對象時,系統首先自動創建一個基類對象,也就是說,在調用派生類構造函數創建派生類對象之前,系統首先調用基類的構造函數創
條款7:為多態基類聲明virtual析構函數
pub get 可能 actor bsp class對象 問題 錯誤 需要 1.假設有如下時間類: class TimeKeeper { public: TimeKeeper(); ~TimeKeeper(); };
c++類的拷貝、賦值與銷毀(拷貝構造函數、拷貝賦值運算符析構函數)
錯誤 保存 編譯 oid 生成 標準庫 int 為什麽 explicit 拷貝構造函數 如果一個構造函數的第一個參數是自身類類型的引用,且任何額外參數都有默認值,則此構造函數是拷貝構造函數。 拷貝構造函數第一個參數必須是一個引用類型。此參數幾乎總是一個con
類變量與實例變量、析構函數、私有屬性與私有方法
ini 實例變量 靜態 light ret int print 更改 odi #coding=utf-8 """ 實例的變量又叫類的靜態屬性 類的方法又叫類的動態屬性 類變量與實例變量的區別 x不用實例化就可以調用 所有實例都可以調用x """ class role()
派生類中的構造函數和析構函數
png truct style call called 調用 AI AS col 1 class base_class{ 2 public: 3 base_class(){ 4 cout<<"base_class constructor
面向對象編程(2)self的含義,析構函數,數據庫類練習
一行代碼 pan host port @property sel hal toc dict 1.類的聯系使用 class Baby(): country = ‘China‘ #類變量,公共的變量,每個實例都可以用 對於公共的東西可以定義節省內存 def my
effective c++ 條款07:為多態基類聲明virtual析構函數
pub effective atomic water delet () IV del effect 記住:帶多態性質的基類應該聲明一個virtual析構函數。如果class帶有任何virtual函數,它就應該擁有一個virtual析構函數。class的設計目的如果不是作為基
python0.16------構造函數/析構函數/self詳解/重寫/訪問限制/對象屬性和類屬性/@property/運算符重載
動態添加 輸出 自然 表示 不可 spa type 錯誤 特點 構造函數:__init__()引子:因為每個人一出生都是不一樣的。因此,如果在Person類中直接給類元素賦值有問題,它會導致每個人的初始狀態相同,這不符合大自然的邏輯。應該根據每個人的特點,給每個出生的人
類的構造函數、析構函數與賦值函數
pan ont add eight run you 簡單的 this temp 類的構造函數、析構函數與賦值函數 構造函數、析構函數與賦值函數是每個類最基本的函數。它們太普通以致讓人容易 麻痹大意,其實這些貌似簡單的函數就象沒有頂蓋的下水道那樣危險。 每個類只有一個析構函數