C 子類 父類的相互轉換 和 虛函式

2021-06-19 21:43:49 字數 1469 閱讀 2979

今天在程式中遇到乙個問題,關於子類 父類的強制轉換的。查了下網路,大概弄懂了些,記錄下來作為筆記。

先看乙個例子

【引自雁南飛的部落格

】在c++的世界中有這樣兩個概念,向上型別轉換,向下型別轉換,分別描述的是子類向基類和基類向子類的強制型別轉換。

向上強制型別轉換

切割:覆蓋方法和子類資料丟失的現象生成切割(slice)。

#include "stdafx.h"

#include using namespace std;

class base

然後我們看監視的結果:

(1)物件層面:

在物件上,我們可以看到所有的轉換都出現了閹割(毋庸置疑的,由於子類的記憶體比父類大,轉換為父類肯定會「丟失」資訊,只會保留相同的東西)。另外由於虛函式的原因,引用和指標都指向子類,而直接物件的轉換則直接指向了父類。

(2)位址層面

從位址上看,採用引用和指標的轉換位址和原始子類一致,直接物件的轉換則位址 被改變減少了16個位元組(為什麼? 沒搞為什麼事減? 為什麼是16? 希望大神能解答).

因此,我們得出結論,在向上強制轉換過程中,使用指標和引用不會造成切割,而使用直接賦值會造成切割。

向下強制型別轉換

使用dynamic_cast進行向下強制型別轉換。使用此關鍵字有一下幾個條件:

1、源型別

必須有虛函式

;2、必須開啟編譯器的rtti開關(vc6: progect-> settings -> c/c++ tab ->category[c++ language]-> enable rtti);

3.必須有繼承關係。

#include 

using namespace std;

class cpoint

;class cpoint3d

: public cpoint

;int main() 

執行結果為:

cpoint3d::f

cpoint3d::f

00000000

這個問題牽扯到c++的物件模型。一般認為子類物件大小》=父類物件大小。為什麼?因為子類可以擴充套件父類,可以增加成員變數。如果乙個子類增加了成員變數,那麼它的物件的記憶體空間會大於父類物件。這時乙個實際指向父類的指標,如果被強制轉化為子類物件指標,當使用這個指標時可能會導致越界訪問非法記憶體。相反,為何子類指標可以轉換為父類指標?因為父類指標需要的,子類物件都有,不會出現非法記憶體訪問。

這就是dynamic_cast不一定成功的原因。如果乙個實際指向子類物件的指標被轉換成了父類指標,然後再用dynamic_cast轉換回來,一定能成功,而乙個實際指向父類物件的指標,被dynamic_cast轉換為子類指標,一定會失敗。

因此,我們可以使用dynamic_cast來判斷兩個類是否存在繼承關係。

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

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

C 中子類與父類的相互轉換

1.父類不能直接強制轉換成子類 2.子類可以強制轉換成父類,但是在父類中只能取父類的字段與方法因此在乙個父類對應多個子類的時候,不知道具體是哪個子類的時候,就可以先宣告乙個父類的型別。如例1 3.由1,2知,父類不能直接強制轉換成子類,但是可以通過間接的方法進行轉換,例1中有所體現 將子類轉換成父類...

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

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