農會 資訊管理類程式設計105 年第 6 題單選題
根據下列的C++語言程式碼,請問輸出結果為何?
```cpp
#include <iostream>
using namespace std;
class CAnimal
{
public:
void Show() { cout << " animal"; }
};
class CMonkey : public CAnimal
{
public:
void Show() { cout << " monkey"; }
};
class CTiger : public CAnimal
{
public:
virtual void Show() { cout << " tiger"; }
};
int main()
{
CAnimal animal;
CMonkey monkey;
CTiger tiger;
CAnimal* pAnimal[3] = { &animal, &monkey, &tiger};
for (int i=0; i<3; i++)
pAnimal[i]->Show();
return 0;
}
```
Aanimal animal animal正確答案
Banimal animal tiger
Canimal monkey tiger
Danimal monkey animal
A正確答案
C++多型性必須從「基類」開始宣告 virtual,本題基類未宣告,故全部靜態繫結輸出 animal。
為什麼答案是 A
基類 CAnimal 的 Show() 非虛擬函式,編譯器採用靜態繫結,透過基類指標呼叫時皆執行 CAnimal::Show()。
考點:靜態繫結考點:多型性誤區考點:多型性條件考點:指標呼叫
載入中…
完整詳解
Pro · 無限重點 C++多型性必須從「基類」開始宣告 virtual,本題基類未宣告,故全部靜態繫結輸出 animal。
秒解:檢查基類 CAnimal 的 Show() 沒有 virtual,直接判定為靜態繫結,全數輸出基類結果。
逐選項分析
A靜態繫結✓ 正確
基類 CAnimal 的 Show() 非虛擬函式,編譯器採用靜態繫結,透過基類指標呼叫時皆執行 CAnimal::Show()。
B多型性誤區✕ 陷阱
誤以為 CTiger 有宣告 virtual 就能觸發多型,但基類未宣告 virtual 時,子類的 virtual 無效。
C多型性條件✕
誤以為所有子類覆寫都能自動觸發多型,忽略了 C++ 必須依賴基類的 virtual 關鍵字來建立虛擬函式表。
D指標呼叫✕
沒有理解指標型別與物件實體的差異,且未掌握靜態繫結規則所產生的錯誤輸出組合。
C++ 函式繫結機制比較
| 繫結型別 | 觸發條件 | 執行結果 |
|---|
| 靜態繫結 (早期) | 基類函式「無」 virtual | 依「指標/參考」型別決定呼叫哪個函式 |
| 動態繫結 (晚期) | 基類函式「有」 virtual | 依「實際物件」型別決定呼叫哪個函式 (多型) |
本題最大陷阱在 CTiger 類別中寫了 virtual。考生易以為只要子類有 virtual 就能多型,但 C++ 規定多型起點必須是基類宣告 virtual,子類單方面宣告無效。