2015-06-20 69 views
1

在下面的代碼中,由於name()是虛擬的,所以我期望派生結構的方法將被調用。相反,寫出來的是「A」。爲什麼?static_cast和C++中的虛擬方法

#include <iostream> 
using namespace std; 
struct A { 
    virtual string name() { return "A"; } 
}; 
struct B : A { 
    string name() { return "B"; } 
}; 
int main (int argc, char *argv[]) { 
    B b; 
    cout << static_cast<A>(b).name() << endl; 
    return 0; 
} 
+4

多態性僅適用於通過方法指針或引用調用。你基本上完成了'A tmp = b; cout << tmp.name()<< endl;'。 –

回答

6

static_cast<A>(b)創建從b構建A類型的臨時變量。所以調用name()確實調用A::name()

爲了觀察多態行爲可能會做

static_cast<A&>(b).name() 
0

正如oliver Charlesworth在評論中提到的那樣,您需要指針或引用所需的對象來查看多態性的影響。然後系統將識別對象的動態類型並調用相應的函數。 Anton Savin的答案解釋瞭如何使用引用來調用多態性。

對於預期的結果,如果你想使用指針,你所要做的是在主要如下:

A *a= new B(); 
cout << a->name() << endl; 
+0

爲什麼動態分配使事情複雜化? –

1

你所經歷被稱爲切片。本質上,靜態投將削減B部遠離對象和你保持只是一個A.

What is object slicing?