2013-05-03 66 views
2

我對使用C++向下轉換對象有疑問。Downcasting a class C++

這裏談到一個例子:

class A { } 
class B : public A { 
    public: 
    void SetVal(int i) { _v = i; } 
    private: 
    int _v; 
} 

A* a = new A(); 
B* b = dynamic_cast<B*>(a); 
b->SetVal(2); 

將它與這個例子發生什麼呢?我們正在修改一個基礎類,就像它是一個小孩一樣......它如何與內存相關?

有了這個演員...是否像創建B的實例並複製A的值?

感謝

回答

6
A* a; 

這只是給你一個指向A。它並沒有特別指出任何地方。它根本不指向AB對象。代碼的工作與否取決於它所指向的對象的動態類型。

所以有兩種情況你可能想知道。首先,這一個:

A* a = new A(); 
B* b = dynamic_cast<B*>(a); 
b->SetVal(2); 

這會給你不確定的行爲,因爲dynamic_cast將返回一個空指針。當對象的動態類型實際上不是B時,它返回空指針。在這種情況下,該對象是A。然後,您嘗試使用b->SetVal(2)取消引用空指針,以便獲取未定義的行爲。

A* a = new B(); 
B* b = dynamic_cast<B*>(a); 
b->SetVal(2); 

這會正常工作,因爲對象確實是B對象。動態演員陣容將成功,SetVal調用將可以正常工作。

但是,請注意,爲此,A必須是多態類型。要做到這一點,它必須至少有一個虛擬成員函數。

+0

'dynamic_cast'只適用於多態對象。 – 2013-05-03 14:36:52

+0

@LuchianGrigore我錯過了一個好點。 – 2013-05-03 14:38:08

+0

@JosephMansfield Will B * b = dynamic_cast (a)在兩種情況下都沒有使用dynamic_cast關鍵字(A是poly/non-poly morphic)? – 2014-03-03 14:39:39

1

甚至不應該編譯,因爲類不是多態的,所以你不能使用dynamic_cast

如果是這樣,那將是未定義的行爲。