2011-04-25 53 views
1

假設我有:C++重載函數和子類

struct Vehicle {...} 
struct Car : public Vehicle {...} 

string A(Vehicle *v) { return "vehicle"; } 
string A(Car *c) { return "car"; } 

而且我這樣做:

Vehicle *v = new Car(); 
cout << A(v); 

爲什麼編譯器打印出 「車」?畢竟,v指向一個Car對象。

+3

您是否嘗試過運行以查看會發生什麼? – 2011-04-25 14:26:47

+1

你試過編譯它嗎?至少應該有一個警告...... – Flinsch 2011-04-25 14:27:36

+1

在這個問題上肯定是-1,可以通過編譯器一分鐘的努力立即解決。 – Puppy 2011-04-25 14:36:52

回答

2

重載函數A(Vehicle*)Vehicle*類型的參數更匹配。所以cout會打印:

​​

說明:

重載函數解析是基於靜態類型的參數來完成。而參數v靜態類型爲Vehicle*。因此,函數A(Vehicle*)將被調用。

1
"vehicle" 

被打印出來

這是因爲靜態類型的v的是車輛。因此,爲Vehicle定義的A被編譯器使用。

編譯器在調用成員函數執行虛擬方法調用時使用動態類型信息。虛擬關鍵字是必需的。在這種情況下,「this」指針將在適當的覆蓋級別適當地向下轉發。

但是,除了這種特殊情況之外,如果沒有顯式的dynamic_cast,編譯器將不會downcast。

+0

這是有道理的。感謝Doug的回答! – 2011-04-25 14:55:45

1

這是靜態綁定的示例。在編譯過程中,很顯然string A(Vehicle *v)函數將被調用。當然應該輸出「車輛」。