以「矩形家族」計算面積與周長為例,示範 抽象基類 定義共同介面(area())、純虛函式 強制子類實作差異行為(side())、公有繼承 建立 IS-A 關係,並透過 switch 選單驗證多型行為。
class Rectangle { // 抽象基類
protected: int a, b; // 子類可直接存取
public:
int area() { return a * b; } // 共同實作:面積
virtual int side() = 0; // 純虛函式:周長(子類必須實作)
};
class Square : public Rectangle { // 正方形
public:
void setA(int a) { this->a = this->b = a; }
virtual int side() { return 4 * a; }
};
class Oblong : public Rectangle { // 長方形
public:
void setA(int a) { this->a = a; }
void setB(int b) { this->b = b; }
virtual int side() { return 2 * (a + b); } // 修正:周長公式 2*(a+b)
};
inline void calculate() {
int choice, a, b;
Oblong o; Square s;
cout << endl << "選擇矩形類型:" << endl;
cout << "1-長方形\n2-正方形\n3-離開" << endl;
cin >> choice;
switch (choice) {
case 1:
cout << "輸入寬 a: "; cin >> a;
cout << "輸入長 b: "; cin >> b;
o.setA(a); o.setB(b);
cout << "面積: " << o.area() << endl;
cout << "周長: " << o.side() << endl;
calculate(); break; // 遞迴選單
case 2:
cout << "輸入邊長 a: "; cin >> a;
s.setA(a);
cout << "面積: " << s.area() << endl;
cout << "周長: " << s.side() << endl;
calculate(); break;
case 3: break;
default: cout << "無效輸入" << endl; calculate();
}
}
int main() { calculate(); return 0; }
選擇矩形類型:
1-長方形
2-正方形
3-離開
1
輸入寬 a: 3
輸入長 b: 5
面積: 15
周長: 16
...
2
輸入邊長 a: 5
面積: 25
周長: 20
...
4
無效輸入
3
| 概念 | 程式碼體現 | 作用 |
|---|---|---|
| 繼承語法 | class Sub : public Base | 建立 IS-A,子類擁有基類非私有成員 |
| Protected 成員 | int a, b; 在基類 | 子類直接存取,外部不可見 |
| 純虛函式 | virtual int side() = 0; | 基類成抽象類,強制子類覆寫,編譯期保證 |
| 虛函式覆寫 | virtual int side() { ... } | 執行期動態綁定,基類指標呼叫子類實作 |
| Inline 函式 | inline void calculate() | 建議編譯器展開,避免遞迴呼叫開銷 |
2 * a * b 是面積變體,正確為 2 * (a + b)。while(true) 迴圈。virtual ~Rectangle() {},確保 delete basePtr 正確釋放子類資源。此範例清晰展示「介面在基類、實作在子類、多型在執行期」的物件導向精髓。