一、常識
隨意開啟一本c++書,基本都會寫著一句話:子物件可以轉化成父物件,父物件不能轉化成子物件。
1.1、
子物件可以轉化成父物件
很好理解,其實就是c++多型的體現,父指標可以指向子物件位址,當呼叫父物件裡生命的函式時,會預設呼叫子物件的此「重寫函式」巴拉巴拉巴拉.....
1.2、
父物件不可轉化成子物件
存在即道理,這句話其實是想說明,子物件的屬性或者函式大多情況下比父物件更豐富,即父親有的東西一定會傳兒子,兒子有的東西父親不一定有【這個比喻顯然不符合百善孝為先的老百姓,但c++是沒有感情的東西】,如果我們將父物件轉化成了子物件,那麼這個物件勢必會無緣無故多了一些原本不存在的屬性或者函式,如果這些屬性裡包含一些指標或者堆上或者特有的東西,在訪問的時候程式基本就崩了,就出現了程式設計師的老熟人「野指標」、「記憶體洩露」....
用乙個例子:
classparent;
class son : public
parent;
main()
如上**:
父親只有錢,兒子繼承了父親的錢,並且兒子還有beautiful girl,但是此時的實體是父親【只有錢沒有beautiful girl】,然後拿著兒子的身份證【介面】去訪問beautiful girl,結果gg找不到
二、誤解
2.1、現象
隨意在bing【強烈抵制baidu】搜尋c++父子類之間的轉換,發現又能找到很多的方法,那這又是為什麼呢?包括平時都或多或少的用到了父類轉子類的方式如:在qt介面是將乙個按鈕嵌入到table裡,然後又拿出來強轉成按鈕使用....
2.2、不多bb直接放結論:
嚴格意義上父類是能轉化成子類的,但有限制條件,一旦不注意就會程式崩潰,不建議使用。
2.3、討論之前需要放兩個概念:
parent* p = new son;
①、指標物件
p,就是指標,根據多型,可以是父指標也可以是子指標。【一般父指標多得多,多型嘛】
②、物件實體
new son,也就是new出來或者最後呼叫建構函式的物件【根據父子子父的順口溜,可以知道最後呼叫哪個物件的建構函式,那這個物件就是最終的子類實體】
2.4、適用現象
為什麼我說父類是能轉化成子類的呢,是因為我們直接用父指標來指向子物件,**是能編譯過的,但是不能用父指標去獲取不屬於自己的屬性或記憶體片。
所以當父指標不會跨界去訪問不屬於自己的東西的時候,是沒問題的。
2.5、解釋神奇現象
上面提到平時qt的一些操作,這個操作雖然用的很多,但是討論這篇文章的時候,同事提出來這個現象,我一時不知如何解釋,感覺多年的c++基礎知識突然崩塌了.....
後來想了想,應該是這樣的步驟:
①、new出子類物件實體,用父指標指向
②、通過父指標將子類物件實體設定到介面上
③、通過父指標從介面上獲取子類物件實體
④、通過static_cast將【父指標指向的】子類物件實體轉成子類
其實整個過程都是子類物件實體,根本沒有父物件實體,所以這裡根本不是父物件轉化成子物件,就是子物件的轉來轉去,只不過用父指標的訪問罷了。
java類的構造與父子類之間的轉換問題
package com.zhao.impl public inte ce ridecar package com.zhao.impl public inte ce rideplane package com.zhao.impl abstract public class person public ...
C 父類和子類之間的轉換
學c 的時候有時候會對類型別之間的轉換感覺到些許的迷惑,下面記錄一點點理解和認識 首先需要明白一點 只有子類轉換成父類,父類不可能轉換成子類。因為子類是從父類繼承而來,子類中包含父類中所有成員。而如果父類可以轉換成子類,意味著將子類中將有一部分是未知的成員。這是不被允許的。在子類轉換成父類的時候,也...
C 子類父類之間相互轉換的問題
為了方便演示,這裡一共有兩個簡單的類 父類 動物類 animal 動物類 父類 public class animal 頭 public string head 子類 狗類 dog 狗類 繼承動物類 public class dog animal 建構函式 public dog 第一步 如果我們將d...