- 多态性的定义
- 多态(Polymorphism)是面向对象编程中的一个重要概念。它是指同一个函数名或操作符在不同的对象或情境下具有不同的行为。简单来说,就是 “多种形态”。例如,在一个图形处理程序中,有 “计算面积” 这个操作,对于圆形、矩形和三角形等不同形状的图形,“计算面积” 这个操作的具体实现是不同的,但都可以用同一个函数名(比如calculateArea)来表示。
- C++ 中实现多态的方式
- 通过虚函数实现运行时多态
- 虚函数的概念:在基类中,将成员函数声明为虚函数(使用virtual关键字)。当通过基类指针或引用调用这个虚函数时,实际调用的是派生类中重写的函数版本。例如:
- 通过虚函数实现运行时多态
class Shape {
public:
virtual double calculateArea() const {
return 0.0;
}
};
class Circle : public Shape {
private:
double radius;
public:
Circle(double r) : radius(r) {}
double calculateArea() const override {
return 3.14159 * radius * radius;
}
};
int main() {
Shape* shapePtr;
Circle circle(5.0);
shapePtr = &circle;
// 调用Circle类中重写的calculateArea函数
double area = shapePtr->calculateArea();
return 0;
}
- 在上述代码中,Shape类是基类,其中的calculateArea函数被声明为虚函数。Circle类是Shape类的派生类,它重写了calculateArea函数。在main函数中,通过基类指针shapePtr指向Circle类的对象,当调用calculateArea函数时,实际调用的是Circle类中的版本,这就是运行时多态。
- 函数重载实现编译时多态
- 函数重载的概念:在同一个作用域内,可以定义多个同名函数,只要它们的参数列表(参数个数、类型或顺序)不同。例如:
int add(int a, int b) {
return a + b;
}
double add(double a, double b) {
return a + b;
}
int main() {
int intSum = add(3, 5);
double doubleSum = add(3.0, 5.0);
return 0;
}
- 这里定义了两个add函数,一个用于整数相加,一个用于浮点数相加。编译器会根据传入的参数类型来确定调用哪个add函数,这种多态是在编译时确定的。
- 多态性的好处
- 增强代码的可扩展性:以图形计算面积为例,如果要添加新的图形类型(如梯形),只需要从基类Shape派生一个新的类(如Trapezoid),并重写calculateArea函数即可。这样,在使用图形对象的代码部分(如一个图形绘制和面积计算系统),不需要进行大量修改就可以适应新的图形类型。
- 提高代码的可维护性:由于多态性将不同对象的相似行为抽象到一个接口(如Shape类的calculateArea虚函数),代码的结构更加清晰。当需要修改某个具体对象的行为(如修改Circle类计算面积的精度)时,只需要在该对象的类定义中修改其对应的函数实现,而不会影响到其他对象和使用这些对象的代码。
- 实现代码的复用:基类中的代码可以被派生类复用。例如,Shape类中的一些通用属性(如颜色、位置等)的处理代码可以被所有派生类(Circle、Rectangle等)共享,同时每个派生类又可以根据自身的特点实现特定的行为(如计算面积)。