C 父類和子類之間的轉換

2021-06-22 13:39:45 字數 789 閱讀 8244

學c++的時候有時候會對類型別之間的轉換感覺到些許的迷惑,下面記錄一點點理解和認識

首先需要明白一點:只有子類轉換成父類,父類不可能轉換成子類。

因為子類是從父類繼承而來,子類中包含父類中所有成員。

而如果父類可以轉換成子類,意味著將子類中將有一部分是未知的成員。這是不被允許的。

在子類轉換成父類的時候,也需要注意,只能是指標或者引用,不能是物件,除非有重寫建構函式和賦值函式。

重寫函式,這改變不了原理。

在轉換成父類的過程中,意味著對子類進行了乙個切割,只是將子類中的父類部分賦值給了父類物件。

有時候可以能會看到這樣的情景。

bulk_item bulk;

item_base *itemp = $bulk;

其中bulk_item是item_base的子類。

上面的表示方式是被允許的。但這裡需要注意的是,這並不表示子類到父類之間有有任何轉換。

要知道指標只是表示位址,什麼型別的指標只是表示從當前位址開始,到這個型別空間指標結束的記憶體塊。

這裡相當於父類的指標指向子類所存在的位址,然而子類中擁有父類的部分,所以這種轉換合法,編譯器不會報錯。

但是下面這樣是不被允許的,儘管itemp指向的是子類型別物件位址。

bulk_item *bulkp = itemp;

編譯器不管是不是正確的,都會報錯。原因就不用說了。如果使用者確定這種轉換是正確的。

可以通過強制轉換

bulk_item *bulk = dynamic_castitemp;

至於使用什麼樣的強制轉換型別自己,看使用者自己了。

C 中子類和父類之間的相互轉換

學c 的時候有時候會對類型別之間的轉換感覺到些許的迷惑,下面記錄一點點理解和認識 首先需要明白一點 只有子類轉換成父類,父類不可能轉換成子類。因為子類是從父類繼承而來,子類中包含父類中所有成員。而如果父類可以轉換成子類,意味著將子類中將有一部分是未知的成員。這是不被允許的。在子類轉換成父類的時候,也...

C 子類父類之間相互轉換的問題

為了方便演示,這裡一共有兩個簡單的類 父類 動物類 animal 動物類 父類 public class animal 頭 public string head 子類 狗類 dog 狗類 繼承動物類 public class dog animal 建構函式 public dog 第一步 如果我們將d...

C 中子類和父類之間的相互轉化

c 父類和子類物件指標之間的轉換,有示例 c 父類和子類物件指標之間的轉換 由子類向父類轉換很簡單,用預設轉換.例如 cwnd pwnd cwnd childview 由父類向子類,用dynamic cast.使用dynamic cast是有限制的.例如對如下語句 cpoint3d p1 dynam...