Q80.
下列C++程式之輸出結果為何?
電腦軟體設計(C++) · 乙級 · C++ · Q80
難易度分析
3 / 5
考查對C++靜態綁定與動態綁定區別的理解,需要精確判斷函式宣告中是否包含特定關鍵字以決定執行行為,具有典型的概念陷阱。
正確答案:①
①
:由於 `member()` 函式未宣告為 virtual,`function(base& x)` 中的呼叫會依據靜態型別(base&)進行早期綁定,因此傳入 base 物件與 derived 物件皆呼叫 `base::member()`,輸出兩次「base class」。
錯誤選項解析
- ②
:此選項假設第二次呼叫會輸出「derived class」,但因為 `member()` 不是虛擬函式,不會發生動態綁定(晚期綁定),即使傳入 derived 物件仍會呼叫 base 版本的函式。 - ③
:此選項假設第一次呼叫輸出「derived class」,但 `function(b)` 傳入的是 base 型別物件,且函式參數為 `base&`,無論是否為 virtual 皆不可能輸出 derived class。 - ④
:此選項假設兩次皆輸出「derived class」,但 `member()` 未宣告為 virtual,不會發生多型行為,編譯器會以參數的靜態型別 `base&` 決定呼叫 `base::member()`。
Learning Tip
"本題核心考點為 virtual 函式與早期綁定/晚期綁定的差異。若 base class 的 `member()` 加上 `virtual` 關鍵字,則會透過虛擬函式表(vtable)進行動態綁定,第二次呼叫將輸出「derived class」。常考陷阱:僅有指標或參考型別才能觸發多型,若參數改為 `base x`(傳值),即使宣告 virtual 也會因物件切割(object slicing)而呼叫 base 版本。"
學員答題分佈
①
0%
②
0%
③
0%
④
0%
此答題分佈是根據學員在 LongePass 模擬考等實際作答紀錄計算而成。與考友分享這道歷屆試題與詳細解析!