本文透過一個完整的幾何圖形類別體系,深度演示虛函數、純虛函數、抽象基類、動態綁定與多型的核心機制與實際應用。
Shape (抽象基類)
├─ Point (點)
│ └─ Circle (圓)
│ └─ Cylinder (圓柱體)
class Shape {
public:
virtual float area() const { return 0.0; }
virtual float volume() const { return 0.0; }
virtual void shapeName() const = 0; // 純虛函數,強制衍生類實現
};
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;
};
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;
};
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;
};
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 = ○
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
此範例完整展示了 C++ 多型的精髓,是掌握物件導向設計的經典教材。