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

C++ 抽象類與純虛函數:接口契約設計的基石

     編輯:VC 教學

**類的分解** 是面向對象設計的核心過程:從模糊的基類 (如「交通工具」) 逐步派生出具體子類 (「汽車」、「飛機」)。當基類**不應被實例化** (無具體語義) 時,引入 **純虛函數** 將其變為 **抽象類**,強制派生類實現關鍵接口,形成「契約式設計」。

為什麼需要抽象類?

  • 基類 Vehicle 只有通用屬性 (速度、載客),無具體行為;
  • 直接 `new Vehicle()` 無業務意義,且易導致邏輯錯誤;
  • 希望**編譯期強制**所有派生類實現 `ShowMember()` 等核心操作。

純虛函數語法與效果


class Vehicle {
protected:
    float speed; int total;
public:
    Vehicle(float s, int t) : speed(s), total(t) {}
    virtual void ShowMember() = 0;  // 純虛函數:=0 表示無定義
    virtual ~Vehicle() {}           // 虛析構:必須!
};
  • 含純虛函數的類 = **抽象類**;
  • 抽象類**不能創建對象** (編譯錯誤);
  • 派生類**必須覆寫**所有純虛函數,否則派生類也是抽象類;
  • 可為純虛函數提供定義 (罕見),供派生類 `::Func()` 顯式調用。

完整可編譯示例


#include 
using namespace std;

class Vehicle {
protected:
    float speed; int total;
public:
    Vehicle(float s, int t) : speed(s), total(t) {}
    virtual void ShowMember() = 0;  // 契約:所有交通工具必須能展示自己
    virtual ~Vehicle() {}
};

class Car : public Vehicle {
    int aird;
public:
    Car(int a, float s, int t) : Vehicle(s, t), aird(a) {}
    void ShowMember() override {  // 必須實現
        cout << speed << "|" << total << "|" << aird << endl;
    }
};

class Plane : public Vehicle {
    float wingspan;
public:
    Plane(float w, float s, int t) : Vehicle(s, t), wingspan(w) {}
    void ShowMember() override {
        cout << speed << "|" << total << "|" << wingspan << endl;
    }
};

int main() {
    // Vehicle v(100, 4); // 編譯錯誤:抽象類不可實例化
    Car c(250, 150, 4);
    Plane p(35.5f, 800, 200);
    c.ShowMember();  // 150|4|250
    p.ShowMember();  // 800|200|35.5

    Vehicle* v1 = &c;
    Vehicle* v2 = &p;
    v1->ShowMember();  // 多態調用
    v2->ShowMember();
    return 0;
}

抽象類 vs 接口 (Interface) 概念對比

特性C++ 抽象類Java/C# Interface
數據成員可包含 (非靜態/靜態)僅常量 (隱式 public static final)
構造函數可有 (供派生類調用)無
實現方法可包含普通虛函數/非虛函數Java 8+ 可 default/static 方法
多重實現多重繼承 (需虛繼承解決菱形)多實現 (無狀態衝突)
訪問控制public/protected/private隱式 public

設計模式中的抽象類角色

  • Template Method:抽象類定義算法骨架 (非虛函數),關鍵步驟聲明純虛函數由子類實現;
  • Strategy:抽象策略類定義純虛執行接口,具體策略類實現;
  • Factory Method:抽象工廠類聲明純虛創建方法,具體工廠決定創建什麼產品。

避坑指南

  1. ❌ **忘記虛析構** → 刪除基類指針時派生資源洩漏;
  2. ❌ **構造函數中調用純虛函數** → 運行時錯誤 (vptr 尚未指向派生 vtable);
  3. ❌ **濫用純虛函數** — 只有真正需要「強制實現契約」時才用,普通虛函數提供默認實現往往更靈活;
  4. ✅ **接口隔離** — 拆分臃腫抽象類為多個細粒度純虛類 (如 `IDrawable`、`ISerializable`),派生類按需多重繼承。

抽象類是「定義規範、延遲實現」的利器。善用純虛函數表達**必須由子類履行的契約**,配合虛析構保證資源安全,能構建出清晰、可擴展、編譯期受保護的類層次體系。

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