2016-11-16 18 views
1

質疑兩個約投射對象的問題在CPP

如果我有兩類:「父親」,以及「MyClassa」,我想這樣做:

father* a; 
MyClassa b; 
a = &b; 
((MyClassa *)a) - > b(); 

我可以做如上面示例中的鑄造(b()是屬於MyClassa類的功能並且在father類中找不到)。

但是,當我這樣做:

father* a; 
MyClassa b; 
a = &b; 
a = ((MyClassa *)a); 
a->b(); 

它不工作,我並告訴我,他b()功能不在該類存在(如鑄件沒有工作)。

這兩個代碼示例實際上有什麼區別,是什麼導致了這種差異?

問題B

當我使用 'dynamic_cast的' 投一個爸爸是這樣一個孩子:

Father * fp= new Father; 
Child * cp = dynamic_cast<Child *> fp; 

它返回我一個 '0' 值指針。 但是,當我做同樣的參考:

Father & fp= new Father; 
Child & cp = dynamic_cast<Child &> fp; 

它提出了一個錯誤「壞鑄造」。

爲什麼會有差異?

在這一行

術語被強制轉換爲MyClassa*但隨後回到father*(在任務),所以你最終有一個father*

+1

給我們一個更完整的例子。 「MyClassa」的類聲明是怎樣的? –

+0

請出示[MCVE]。 –

+0

這些問題無關,請將它們分開。 – Tali

回答

1

關於你提到的第二個問題:這是不可能的從父親投給孩子參考,並在多態方面的「錯誤」

+0

謝謝。關於第二個問題 - 那麼爲什麼當我從父指針轉換爲子指針(不是引用,而是指針)時,它會返回我'0'值並且不會拋出一個轉換錯誤? –

+0

來自http://en.cppreference.com/w/cpp/language/dynamic_cast: 如果轉換失敗並且new_type是指針類型,它將返回該類型的空指針。如果轉換失敗並且new_type是引用類型,則會拋出一個與std :: bad_cast類型的處理程序匹配的異常。 – gbehar