侯捷 是我十分崇拜的乙個智者。 他的著作和翻作一直十分喜歡。 他對技術是如此的執著和一絲不苟。
不太想寫些c++的東西, 斷章取義比較嚴重。 僅以微薄的知識分析一下, 斷章取義一下。
class a ;
class b;
class ab : public b, public a
... (大概是main吧)
ab *pab = new ab();
a* pa = (a*)pab;
b* pb = (b*)pab;
delete pa; (記憶體洩漏)
標準c++ delete 的語義是
1. 析購
2. 釋放記憶體
惜購上比較複雜的, 關係到類到底有沒有惜購函式(自定義也好, 編譯器產生也好)和是否是虛擬惜購函式等等。
第一步 文中的delete 如果有惜購函式的話, 像這樣
a:~a(pa); (a b都沒有虛擬惜購, 當然沒有惜購函式的話就不會有這個呼叫了)
ab:~ab(pa); (a b都有虛擬惜購, 由於繼承體系,基類的惜購函式會相繼呼叫 )
a:~a(pa); (a 沒有虛擬惜購函式)
因為如果類有虛函式, 編譯時刻, 在基棧上放置vptb, 而類的例項附加了vptr, vptr的指向, 決定了呼叫哪個虛函式。
這裡可能是有洩漏的, 因為可能沒有呼叫真確的惜購函式, 導致類內堆上分配的資料沒有惜購。這是即使raii慣用法也失效了。
第二步 釋放記憶體的話, 肯定是洩漏的。
多繼承的記憶體布局是這樣的ba
aba* pa = (a*)pab; 這句和c有很大的差別, 編譯器會介入,導致pa指向 ab類資料結構 的a
delete 的這部實作是 free((char*)pa); b段的資料沒有釋放。
delete pb; 那是安全的。 另外void* 轉換的話, 編譯器不會介入。
每日一題 46 不能被繼承的類
題目來自劍指offer 使用c 設計乙個不能被繼承的類,思路一 思想 建構函式和析構函式為私有 新增倆方法 方法 把建構函式和析構函式設定為私有函式 新增倆方法建立物件和銷毀物件 原因 1 把建構函式和析構函式設定為私有函式 防止子類呼叫建構函式函式和析構函式,防止繼承 2 新增倆方法建立物件和銷毀...
hdu5723 多校第一題,longlong
官方題解在這 首先注意到任意兩條邊的邊權是不一樣的,由此得知最小生成樹是唯一的,最小生成樹既然 是唯一的,那麼期望其實也就是唯一的,不存在什麼最小期望。求完最小生成樹之後,接下 來的問題就可以轉換成在最小生成樹上求任意兩點之間距離的平均值,對於每條邊,統計所 有的路徑用到此邊的次數,也就是邊的兩端的...
繼承 多繼承
一 繼承 1 封裝 self引數傳入的是建立的物件,self可以直接將物件帶引數傳入類中方法,這種在物件中封裝資料,對類進行了優化的方法就叫封裝。2 當乙個繼承自另乙個累的時候,會先去子類裡面找,如果有先呼叫沒有去夫類找。1 class rectangle 矩形類 def init self,len...