虛函式呼叫中的指標型別轉換以及指標所指型別的本質

2022-03-31 13:20:25 字數 952 閱讀 9928

父類型別指標可指向子類物件,呼叫子類物件重寫的虛函式,一條**即有了不同的表現結果,也就是多型。

很顯然,子類重寫的虛函式裡呼叫的自然是子類的成員變數,父類型別指標是無法直接訪問到子類的成員變數的。那麼既然是父類型別指標呼叫的子類的虛函式,那麼傳給this的自然就是父類型別的指標,那麼又如何能訪問到子類的成員變數呢?

細心想一下就明白了,this指標也是有型別的,其型別就是類本身型別,所以子類的虛函式中,this指標的型別就是子類型別,因此當父類型別的指標作為實參傳進去時,會強制轉換成子類型別指標,這樣就能正確訪問子類成員變數。

如**所示:

child child;

parent *p = &child;

//如果print()是子類重寫的虛函式,那麼完整的print()的型別是:

//virtual void print(child *this);

//p將強制轉換成child*型別,然後初始化this

p->print();

這裡另乙個實質性的問題就是,為什麼父類指標已經指向了子類物件,卻不能直接訪問其成員變數呢?這是因為指標的解引用的結果在本質上,就是一塊固定記憶體空間的大小。父類和子類所佔記憶體大小一般不一樣,因此解引用了父類型別指標,得到的記憶體空間並不是子類的記憶體空間。只有將父類型別指標型別強行轉換成子類型別的指標,那麼解引用指標後,得到的就是子類物件的記憶體空間了,也就可以合法訪問子類記憶體空間中的成員變數了。

知道了這一點,就可以用間接的方法,使指向子類物件的父類型別指標訪問子類的成員變數了。如**:

class

parent

;class child : public

parent

;int

main()

配以圖示:

函式指標的型別轉換

1 鋪墊 在分析上面的語句前,我們先從簡單的入手。先來區別和理解下面這兩個定義。float g 和 float h 直接上答案 由於 結合的優先級別高於 所以g先和後面的 結合,構成乙個函式,該函式的返回值是乙個指向float 數的指標。同理,h是乙個函式指標,它所指向的函式的返回值是乙個浮點數。當...

虛函式表指標以及虛函式表建立時機

一 虛函式表指標 vptr 建立時機 vptr跟著物件走,所以物件什麼時候建立出來,vptr就什麼時候建立出來,也就是執行的時候。當程式在編譯期間,編譯器會為建構函式中增加為vptr賦值的 這是編譯器的行為 當程式在執行時,遇到建立物件的 執行物件的建構函式,那麼這個建構函式裡有為這個物件的vptr...

虛函式表指標與型別

1.虛函式表指標參與繼承 虛函式指標是在首次宣告虛函式的型別中北編譯器新增進去的,因為在所有這個型別的派生類中和虛函式有相同簽名的函式自動作為虛函式處理,所以所有那些派生型別中都需要有乙個虛函式表指標以作為支虛擬特性的基礎設施。因此,我們可以認為這個虛函式表指標參與了繼承,雖然每個派生型別中的虛函式...