定義派生類和繼承類(從彙編分析)

2021-10-12 08:08:39 字數 2159 閱讀 9514

下面我來分析幾段繼承的類跟大家總結一下前面所說的一些理論知識,這裡解釋了前面 提供預設建構函式的第二點哦,仔細看

仔細觀察位址401090,這裡先呼叫了子類的建構函式,但是原來子類裡面並沒有建構函式,這就是編譯器給出的預設建構函式,需要通過這個建構函式,像乙個踏板一樣,跳到父類的建構函式去,這裡就是前面所講過的 提供預設建構函式的第二點知識。(情況是:父類有建構函式,但是子類沒有)

(這裡我一直在想,不是得先呼叫父類的建構函式嗎,為什麼這裡先子類呢?因為你要發現是否有父類,你得先進入子類建構函式去看,先進子類建構函式去看,如果有,則跳到父類建構函式,沒有則向下執行,因為這裡是提供的預設建構函式,即空函式,所以的話,只有進門操作,執行操作的話直接沒了,所以直接返回)

總結:當cdervie類沒有建構函式時,為了能夠在cdervie類物件 產生時呼叫 成員物件 的建構函式,編譯器同樣會提供預設建構函式,以實現成員建構函式的呼叫。

但是,如果子類含有建構函式,而父類不存在建構函式,則編譯器不會為父類提供預設的建構函式。在構造子類時,由於父類中沒有虛表指標,也不存在構造祖先類的問題,因此新增預設建構函式沒有任何意義

彙編角度來看待構造順序

根據上面彙編**分析:

構造的順序為:先構造父類(位址4010d5處),然後按宣告的順序構造成員物件(位址4010e7處)和初始化列表中的指定的成員(位址4010ef處),最後才是建構函式(位址4010f6處)。

有了這樣的記憶體結構,不但可以使用指向子類物件的子類指標間接定址到父類定義的成員,而且可以使用指向子類物件的父類指標間接定址到父類定義的成員中。

在使用父類成員函式中,傳遞的this指標也可以是子類物件的首位址,因此,在父類中,可以根據以上記憶體結構將子類物件的首位址視為父類物件的首位址來進行資料操作,而且還不會出錯。

由於父類物件的長度不超過子類物件,而子類物件只要派生新的資料,其長度即可超過父類,因此子類指標的定址範圍不小於父類指標,在使用子類指標訪問父類時,如果訪問的成員資料是父類物件所定義的,那麼不會出錯,如果訪問的是子類派生的成員資料,則會造成訪問越界。

父類中成員函式setnumber 在子類中並沒有被定義,但根據派生關係,子類中可以使用父類的共有函式。編譯器是如何實現正確匹配呢?

如使用物件或物件的指標呼叫成員函式,編譯器可根據物件所屬作用域來使用「名稱粉碎法」,以實現正確匹配。在成員函式中呼叫其他成員函式時,可匹配當前作用域。

父類資料成員被排列在最前端的目的是為了在新增派生類後方便子類使用父類中的成員型別,並且可以將子類指標當父類指標來使用。

這樣一來,不管是操作子類物件還是父類物件,只要確認了物件的首位址,對父類成員資料的偏移量而言都是一樣的。對子類的物件而言,使用父類指標或者子類指標都可以正確訪問其父類資料。反之,如果使用乙個子類物件的指標去訪問父類物件,則存在越界訪問的危險。

子類物件的指標訪問父類物件存在的危險:

繼承和派生類

一 基本概念 繼承是物件導向的程式設計的重要特色之一,它可以有效提高軟體的重用性。若在已有類a的基礎上建立了乙個新類b,則稱類b繼承了類a,類a稱為基類或父類,類b稱為派生類或子類。c 中,繼承又分單一繼承和多重繼承。若派生類只有乙個基類,則稱為單一繼承 若派生類的基類多於乙個,則稱為多重繼承。1 ...

繼承 基類和派生類

說明派生類的生成和使用 include using namespace std class test1 基類 test1 int a x a void disp class test2 public test1 派生類 test2 int a,int b test1 a void disp intm...

定義基類和派生類

作為繼承關係中根節點的類通常都會定義乙個虛析構函式。基類通常都應該定義乙個虛析構函式,即使該函式不執行任何實際操作也是如此。成員函式與繼承 在c 語言中,基類必須將它的兩種成員函式區分開來 一種是基類希望其派生類進行覆蓋的函式 另一種是基類希望派生類直接繼承而不要改變的函式。對於前者,基類通常將其定...