假設我有: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對象。
假設我有: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對象。
重載函數A(Vehicle*)
與Vehicle*
類型的參數更匹配。所以cout
會打印:
說明:
重載函數解析是基於靜態類型的參數來完成。而參數v
的靜態類型爲Vehicle*
。因此,函數A(Vehicle*)
將被調用。
"vehicle"
被打印出來
這是因爲靜態類型的v的是車輛。因此,爲Vehicle定義的A被編譯器使用。
編譯器在調用成員函數執行虛擬方法調用時使用動態類型信息。虛擬關鍵字是必需的。在這種情況下,「this」指針將在適當的覆蓋級別適當地向下轉發。
但是,除了這種特殊情況之外,如果沒有顯式的dynamic_cast,編譯器將不會downcast。
這是有道理的。感謝Doug的回答! – 2011-04-25 14:55:45
這是靜態綁定的示例。在編譯過程中,很顯然string A(Vehicle *v)
函數將被調用。當然應該輸出「車輛」。
您是否嘗試過運行以查看會發生什麼? – 2011-04-25 14:26:47
你試過編譯它嗎?至少應該有一個警告...... – Flinsch 2011-04-25 14:27:36
在這個問題上肯定是-1,可以通過編譯器一分鐘的努力立即解決。 – Puppy 2011-04-25 14:36:52