C++高階教程之繼承得本質:單繼承(一)

windows小菜雞發表於2020-11-30

單繼承到底發生了什麼

託更了C++得高階教程好久了,今天有空先來更新一章C++得單繼承。通過彙編來了解一下C++得繼承得本質到底是什麼,為啥說子類可以訪問父類得非私有成員,而父類卻不能訪問子類得成員。
首先讓我們看一下結構體和類到底有什麼區別。
大家都知道C語言中有結構體,C++有類,通過前面兩章,大家應該知道了類和結構體沒有什麼本質得區別。可以說類就是被編譯器限制了許可權得結構體,那麼單繼承發生了什麼呢。

  • 1、首先讓我們看一個結構father
    *在這裡插入圖片描述
    其反彙編大家應該很清楚,就是在記憶體中依次存下了1,2,3。
    在這裡插入圖片描述
    在這裡插入圖片描述
  • 2、我們再建一個結構體Son,檢視其記憶體佈局
  • 在這裡插入圖片描述
    其記憶體佈局其實也是依次存在相關得值。
    *3、單繼承記憶體佈局??
    我們讓son繼承father記憶體會發生什麼變化呢
    在這裡插入圖片描述
    我們發現son把father得記憶體拷貝了一份,放在自己得記憶體區域內。
  • 4、變數重寫得本質
    我們改變一種寫法,先初始化一個父類,子類再繼承會發生什麼
    在這裡插入圖片描述
    其實我們發現,子類不會改變已例項化得父類得物件。因為其是複製內容到自己得記憶體空間,當然是不會變得了
  • 5、父類引用子類得本質
    那麼大家都說父類引用子類,會失真。不能訪問子類得成員。那麼本質是啥呢
    在這裡插入圖片描述
    我們可以看到,父類只拷貝了子類中屬於成員得那部分,這樣當然當然就不能訪問子類中得成員啦。
  • 6、父類無損訪問子類內容
    那麼父類想要訪問子類得成員怎麼辦,當然是指標啦。看下面得試驗
    在這裡插入圖片描述
    定義一個父類得指標,指向子類成員,計算好偏移就可以訪問子類得成員啦。

總結

其實子類繼承父類就是複製父類成員變數。如下面得圖。我們可以讓父類指標指向子類得開始位置,那麼可以通過指標偏移訪問到子類得物件。如果不定義指標得化,那麼父類引用子類得化,只會複製屬於自己得一部分來初始化,當然也就不能訪問子類得內容了
在這裡插入圖片描述

記住複製這個關鍵點就能夠很好得理解一些內容。關於成員函式是怎麼回事,後續會介紹虛擬函式和虛擬函式表得本質。(PS:希望自己不要忘了把)

相關文章