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

C++ 虛函數與抽象基類完整實戰範例:幾何圖形體系

     編輯:關於C

本文透過一個完整的幾何圖形類別體系,深度演示虛函數、純虛函數、抽象基類、動態綁定與多型的核心機制與實際應用。

類別階層設計

Shape (抽象基類)
  ├─ Point (點)
  │    └─ Circle (圓)
  │         └─ Cylinder (圓柱體)

關鍵代碼片段

1. 抽象基類 Shape

class Shape {
public:
    virtual float area() const { return 0.0; }
    virtual float volume() const { return 0.0; }
    virtual void shapeName() const = 0;  // 純虛函數,強制衍生類實現
};

2. Point:實作 shapeName,繼承 area/volume 預設值

class Point : public Shape {
public:
    Point(float x=0, float y=0) : x(x), y(y) {}
    virtual void shapeName() const { std::cout << "Point:"; }
    float getX() const { return x; }
    float getY() const { return y; }
protected:
    float x, y;
};

3. Circle:覆寫 area,新增 radius

class Circle : public Point {
public:
    Circle(float x=0, float y=0, float r=0) : Point(x,y), radius(r) {}
    virtual float area() const { return 3.14159f * radius * radius; }
    virtual void shapeName() const { std::cout << "Circle:"; }
    float getRadius() const { return radius; }
protected:
    float radius;
};

4. Cylinder:覆寫 area 與 volume,新增 height

class Cylinder : public Circle {
public:
    Cylinder(float x=0, float y=0, float r=0, float h=0) 
        : Circle(x,y,r), height(h) {}
    virtual float area() const { 
        return 2*Circle::area() + 2*3.14159f*radius*height; 
    }
    virtual float volume() const { return Circle::area() * height; }
    virtual void shapeName() const { std::cout << "Cylinder:"; }
protected:
    float height;
};

主程式:靜態 vs 動態綁定對比

int main() {
    Point pt(3.2, 4.5);
    Circle cir(2.4, 1.2, 5.6);
    Cylinder cyl(3.5, 6.4, 5.2, 10.5);

    // 靜態綁定:直接呼叫
    pt.shapeName();  std::cout << pt << std::endl;
    cir.shapeName(); std::cout << cir << std::endl;
    cyl.shapeName(); std::cout << cyl << std::endl;

    // 動態綁定:基類指標指向衍生物件
    Shape* p = &pt;
    p->shapeName();  // 輸出 Point:
    std::cout << "area=" << p->area() << ", volume=" << p->volume() << std::endl;

    p = &cir;
    p->shapeName();  // 輸出 Circle:
    std::cout << "area=" << p->area() << ", volume=" << p->volume() << std::endl;

    p = &cyl;
    p->shapeName();  // 輸出 Cylinder:
    std::cout << "area=" << p->area() << ", volume=" << p->volume() << std::endl;
}

執行結果摘要

Point:  [3.2,4.5]      area=0      volume=0
Circle: [2.4,1.2], r=5.6  area=98.52  volume=0
Cylinder:[3.5,6.4], r=5.2, h=10.5 area=512.6 volume=891.96

核心結論七點

  1. 含純虛函數的類別即為抽象基類,不可實例化。
  2. 抽象基類不一定對應現實實體,單純定義介面契約。
  3. 類別樹頂層常為抽象基類,集中共性介面。
  4. 抽象基類提供統一介面,實現「介面隔離實作」。
  5. 區分靜態綁定(編譯期決定)與動態綁定(執行期決定)。
  6. 基類宣告 virtual,衍生類同簽名函數自動為 virtual。
  7. 虛函數提升擴充性:使用者無需知曉具體類別細節,僅對基類介面程式設計,降低耦合與學習門檻。

此範例完整展示了 C++ 多型的精髓,是掌握物件導向設計的經典教材。

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