第31讲 多态
基本概念
多态(Polymorphism)是面向对象编程(OOP)的一个重要特性。在 C++ 中,多态是指用同一个函数名或操作符在不同的上下文中可以表现出不同的行为。简单来说,多态允许不同的对象对同一消息(函数调用)做出不同的响应。
多态的类型
(1)编译时多态(静态多态)
①函数重载(Function Overloading):在同一个作用域内,可以定义多个同名函数,但是它们的参数列表(参数个数、类型、顺序)不同。
示例如下:
#include <iostream>
using namespace std;//静态多态
//函数名称重载
int add(int a, int b)
{return a + b;
}double add(double a, double b)
{return a + b;
}int main()
{int x = 0, y = 10;double pai = 3.14, e = 2.72;int result0 = add(x, y);double result1 = add(pai,e);std::cout<< result0 <<endl;std::cout << result1 <<endl;system("pause");return 0;
}
②运算符重载(Operator Overloading):C++ 允许重新定义运算符的操作,使其适用于用户自定义的数据类型。
示例如下:
#include <iostream>
using namespace std;//静态多态
//重载运算符"+"实现复数相加
class Complex {
private:double real;double image;public://含有初始化列表的有参构造Complex(double r=0,double i=0):real(r),image(i) {}Complex operator + (const Complex& other) {Complex result;result.image = this->image + other.image;result.real = this->real + other.real;return result;}void printInfo(){cout << "Complex = " << this->real << "+" << this->image << "j" << endl;}
};int main()
{Complex c1(1, 2);Complex c2(3, 4);Complex c3 = (c1 + c2);c3.printInfo();system("pause");return 0;
}
(2)运行时多态(动态多态)
虚函数(Virtual Function)和覆盖(Override):在基类中定义一个虚函数,然后在派生类中重新定义这个虚函数(函数签名相同),当通过基类指针或引用调用这个函数时,会根据对象的实际类型(是基类对象还是派生类对象)来决定调用基类的函数还是派生类的函数。
代码示例:
#include <iostream>
using namespace std;class Shape {
public:virtual void draw(void){std::cout << "画了一个图形" << endl;}
};class Circle : public Shape {
public:void draw(void) override{std::cout << "画了一个圆形" << endl;}};int main()
{Shape* shapePtr = new Circle; //多态机制让基类指针可以指向了派生类空间shapePtr->draw();delete shapePtr;system("pause");return 0;
}
作用
为什么使用多态?
灵活性 :允许我们编写可以处理不确定类型的对象的代码。
可扩展性 :我们可以添加新的派生类而不必修改使用基类引用或指针的代码。
接口与实现分离 :我们可以设计一个稳定的接口,而将具体的实现留给派生类去处理