首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C/C++ 學習手札(二):繼承與虛擬函式實作多型

     編輯:關於C++

以「矩形家族」計算面積與周長為例,示範 抽象基類 定義共同介面(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 正確釋放子類資源。

此範例清晰展示「介面在基類、實作在子類、多型在執行期」的物件導向精髓。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved