C++高階教程之繼承得本質:單繼承(一)
單繼承到底發生了什麼
託更了C++得高階教程好久了,今天有空先來更新一章C++得單繼承。通過彙編來了解一下C++得繼承得本質到底是什麼,為啥說子類可以訪問父類得非私有成員,而父類卻不能訪問子類得成員。
首先讓我們看一下結構體和類到底有什麼區別。
大家都知道C語言中有結構體,C++有類,通過前面兩章,大家應該知道了類和結構體沒有什麼本質得區別。可以說類就是被編譯器限制了許可權得結構體,那麼單繼承發生了什麼呢。
- 1、首先讓我們看一個結構father
*
其反彙編大家應該很清楚,就是在記憶體中依次存下了1,2,3。
- 2、我們再建一個結構體Son,檢視其記憶體佈局
其記憶體佈局其實也是依次存在相關得值。
*3、單繼承記憶體佈局??
我們讓son繼承father記憶體會發生什麼變化呢
我們發現son把father得記憶體拷貝了一份,放在自己得記憶體區域內。- 4、變數重寫得本質
我們改變一種寫法,先初始化一個父類,子類再繼承會發生什麼
其實我們發現,子類不會改變已例項化得父類得物件。因為其是複製內容到自己得記憶體空間,當然是不會變得了 - 5、父類引用子類得本質
那麼大家都說父類引用子類,會失真。不能訪問子類得成員。那麼本質是啥呢
我們可以看到,父類只拷貝了子類中屬於成員得那部分,這樣當然當然就不能訪問子類中得成員啦。 - 6、父類無損訪問子類內容
那麼父類想要訪問子類得成員怎麼辦,當然是指標啦。看下面得試驗
定義一個父類得指標,指向子類成員,計算好偏移就可以訪問子類得成員啦。
總結
其實子類繼承父類就是複製父類成員變數。如下面得圖。我們可以讓父類指標指向子類得開始位置,那麼可以通過指標偏移訪問到子類得物件。如果不定義指標得化,那麼父類引用子類得化,只會複製屬於自己得一部分來初始化,當然也就不能訪問子類得內容了
記住複製這個關鍵點就能夠很好得理解一些內容。關於成員函式是怎麼回事,後續會介紹虛擬函式和虛擬函式表得本質。(PS:希望自己不要忘了把)
相關文章
- odoo 繼承(owl繼承、web繼承、view繼承)Odoo繼承WebView
- C++中公有繼承、保護繼承、私有繼承的區別C++繼承
- C++繼承C++繼承
- JAVA物件導向高階一:繼承Java物件繼承
- JAVA物件導向高階:繼承:許可權修飾符(繼承注意事項) 單繼承 Object類 方法重寫Java物件繼承Object
- python高階語法:繼承性Python繼承
- C++ | 類繼承C++繼承
- 菱形繼承,虛繼承繼承
- 原型,繼承——原型繼承原型繼承
- day23:單繼承&多繼承&菱形繼承&__init__魔術方法繼承
- 多繼承 與 多重繼承繼承
- C++繼承體系C++繼承
- C++中的繼承C++繼承
- Javascript繼承2:建立即繼承—-建構函式繼承JavaScript繼承函式
- Javascript繼承4:潔淨的繼承者—-原型式繼承JavaScript繼承原型
- JavaScript進階之繼承JavaScript繼承
- JS進階系列 --- 繼承JS繼承
- 繼承繼承
- C++ 整理15_繼承C++繼承
- C++ protected繼承意義C++繼承
- 類别範本與繼承繼承
- 類的繼承_子類繼承父類繼承
- Web前端------JS高階繼承的實現方式Web前端JS繼承
- JavaScript繼承JavaScript繼承
- javascript:繼承JavaScript繼承
- python繼承Python繼承
- JavaScript 繼承JavaScript繼承
- 10 #### 繼承繼承
- python 繼承Python繼承
- 多繼承繼承
- css可繼承屬性和非繼承屬性一覽CSS繼承
- c++中的繼承關係C++繼承
- python 基礎之繼承、重寫、多繼承Python繼承
- C++學習筆記——C++ 繼承C++筆記繼承
- 什麼是繼承?Python繼承的特徵有哪些?繼承Python特徵
- C++單繼承、多繼承情況下的虛擬函式表分析C++繼承函式
- C++ 多級繼承與多重繼承:程式碼組織與靈活性的平衡C++繼承
- c++繼承,隱藏(重定義)C++繼承