2014-01-23 61 views
-2

兩類比方說,我們有兩大類:的dynamic_cast:具有幾乎相同的方法

class A: 
{ 
    A(int a); // c'tor 
    virtual ~A(); // d'tor 
    FirstMethod(...); 
    SecondMethod(...); 
} 

class B:public A 
{ 
    B(int a); // c'tor 
    ~B(); // d'tor 
    FirstMethod(...); 
    SecondMethod(...); 
} 

這兩個類A和B具有完全相同的方法(相同的名稱和參數,但不一定是相同的功能)和成員,除了析構函數的名稱和構造函數的名稱不同外。現在 ,假設我們有一個對象:

A* aObject = new A(); 

,我們做到:

B* bObject= dynamic_cast<B*>(aObject); 

請問最後成功鑄造或bObject將是NULL?換句話說,程序能區分A *類型的對象和B *類型的對象嗎?

+0

你可以隨時檢查它是否是一個錯誤的指針或抓住'std :: bad_cast'。所以我會重申你的問題。另一方面說明,你的代碼不能編譯。析構函數不能有參數。 – 2014-01-23 02:06:12

+0

我不好好回答而不去思考,它被刪除了。實際上,'dynamic_cast'與'具有相同的基類'沒有關係。它用於將指針從基類轉換爲派生類,而不是派生類之間。 – xis

+0

@蘇小格,問題是編輯的,B是從A – user2750466

回答

4

最後一次鑄造成功或bObject將爲NULL?

這將是NULL。動態鑄造不會奇蹟般地創建B。如果您有實際的B指向,它只會給您一個B*。在這裏,你只有一個A

+0

我知道這很奇怪,我不知道爲什麼,但我認爲處理器無法區分A和B之間的區別,因爲它們完全一樣,除了名稱(以及c'tor和d'tor )。那麼,在這種情況下,當B從A派生出來時(A有一個虛擬方法),dynamic_cast返回值是否爲NULL? – user2750466

+0

@ user2750466:如果您的計算機無法區分「A」和「B」之間的差異,那麼您將陷入一堆麻煩中...​​... –

1

動態轉換將失敗,但編譯將首先失敗。我知道你的意圖,但我認爲你正在嘗試編寫dynamic_cast(aObject)而不是嘗試轉換類型。這是編譯失敗。但是在得到糾正之後,動態轉換仍然會失敗,因爲aObject不是B *類型的(它不能通過is-a測試)。對於它的工作,B必須從A派生。

+0

B是從A派生出來的,但是我的問題是如果它是A,而我們試圖將它投射到B,它會成功還是失敗? – user2750466

+0

不,B不是從A派生的。這可能是你的意圖,但這不是基於你的代碼片段的情況。對於你上面的評論,沒有演員仍然會失敗,因爲A不是B,儘管B可能是A. –

+0

@Paul Dardeau,我編輯了問題 – user2750466

相關問題