C++中的多態性可以通過虛函數(virtual function)和動態分派(dynamic dispatch)來實現。動態分派是一種在運行時根據對象的實際類型來調用相應函數的方法。這是通過虛函數表(vtable)和虛函數指針(vptr)實現的。
以下是一個簡單的示例,展示了如何使用虛函數和動態分派實現多態性:
#include <iostream>
// 基類 Shape
class Shape {
public:
// 虛函數 area()
virtual double area() const {
return 0.0;
}
};
// 派生類 Circle,繼承自 Shape
class Circle : public Shape {
public:
Circle(double radius) : radius_(radius) {}
// 重寫基類的虛函數 area()
double area() const override {
return 3.14159 * radius_ * radius_;
}
private:
double radius_;
};
// 派生類 Rectangle,繼承自 Shape
class Rectangle : public Shape {
public:
Rectangle(double width, double height) : width_(width), height_(height) {}
// 重寫基類的虛函數 area()
double area() const override {
return width_ * height_;
}
private:
double width_;
double height_;
};
int main() {
// 使用基類指針指向派生類對象
Shape* shape1 = new Circle(5.0);
Shape* shape2 = new Rectangle(4.0, 6.0);
// 調用動態分派的虛函數 area()
std::cout << "Circle area: " << shape1->area() << std::endl;
std::cout << "Rectangle area: " << shape2->area() << std::endl;
// 釋放內存
delete shape1;
delete shape2;
return 0;
}
在這個示例中,我們定義了一個基類 Shape
和兩個派生類 Circle
和 Rectangle
。基類中有一個虛函數 area()
,派生類分別重寫了這個函數。在 main()
函數中,我們使用基類指針指向派生類對象,并通過動態分派調用相應的 area()
函數。這就是C++多態性的實現方式。