標籤:

C++ 派生類指針和基類指針可以在函數形參和實參上轉換嗎?

比如函數形參是基類對象的指針,實參是派生類對象的指針,是不是函數進來的只是派生類中的基類成員?


指針實際上就是地址編號而已,一般地,在數值上等於一個對象在內存中所佔的第一個 byte 的地址。而類型的 size 決定了從首地址開始算起有多少個 byte 是你能進行合法訪問的。你要是把這個指向基類型的指針轉型為指向派生類型的指針類型 (無論你是用 dynamic_cast 或是 reinterpreted_cast),都是能合法訪問到派生類型相對於基類型所增加的成員的。

這裡你只要想通兩點就可以了:1. 傳址傳的是元素所佔第一個 byte 的地址,從這個 byte 能往後讀多少,取決於類型的 size;2. 在一般的實現里,派生類相對基類所增加的成員變數,都是布局在基類成員的後面的。所以只要指針轉型成派生類指針,當然能訪問到原來派生類型參數的所有的屬性。

有關基類和派生類之間關係的問題實屬 C++ 的基礎性問題,相信很多人學完後都能像背標準答案似的回答上來。但是,如若想完全理解這個問題,懂一點 C++ 的內存模型知識就很有好處。


用指針就沒有截斷的問題。


可以,能編譯過就說明可以了。如果派生類是多繼承的甚至可以看到指針的值發生了變化。

另外,建議嘗試從對象的角度考慮問題。在c++中所謂類可以認為是個模板(字面意思,不是指c++術語中的那個模板),而對象就是根據這個模板構造出來的物理實體,也就是一段內存。

找本講c++對象模型的書學習一下,這些就都明白了。


是的,這個就是派生類轉換基類問題

可以多看看代碼會發現很多,參數傳入都是基類指針 objectbase* pobject這種

這種有好處,就是設計時不用考慮後面類繼承問題,還可以用多態性實現調用繼承類的方法。

基類與派生型向上向下轉換詳解 - 梁筆記?

zouzhongliang.com圖標基類派生類構造與析構 - 梁筆記?

zouzhongliang.com

C++虛函數定義、作用、使用注意點 - 梁筆記?

zouzhongliang.com


這不就是多態么,從內存角度來說,不管什麼類型的指針,他代表的都只是一個內存地址,區別在於解引用的時候,不同類型的指針得到的內容就不一樣,int型的指針,就取得對應四個位元組里的內容,short就取兩個位元組的內容。所以對象也是一樣。假設A類型的對象,佔據了10個位元組。那就取十個位元組的值,B繼承了A,佔據了20位元組,那麼A類指針指向B類對象的時候,解引用就只能得到前十個位元組,你想讓B類指針指向A類對象也是可以的,但是他會取20位元組的內容,而A對象只有10位元組,那剩下的10個位元組可能就是臟數據。對於對象類型,取十個位元組的內容代表的是整個對象。


自己寫一個測試程序,跟蹤調試輕鬆找到答案,幹嘛要問別人


推薦閱讀:

請問這個函數void這麼用是什麼意思?
大學室友跟我說c++沒人用了,我該怎麼回復他?
對初學者C語言用啥軟體(手頭上沒書)?
學好c++至少要編多少個程序?
自然飽和度「大師們」真沒懂!

TAG:C | CC |