多态有两种主要的类型:
静态多态(编译时多态)和动态多态(运行时多态)。
1、静态多态(编译时多态):
静态多态是指在编译时就确定了对象的类型、方法的调用以及绑定。常见的实现方式是函数重载和运算符重载。函数重载允许在同一个作用域内定义多个名称相同但参数类型或参数个数不同的函数,在编译时根据调用时传递的参数类型或个数来确定具体调用哪个函数。运算符重载则使用特殊的函数名和关键字来对运算符进行重新定义,使得它们能够按照自定义的方式操作对象。
2、动态多态(运行时多态):
动态多态是指在运行时根据对象的实际类型来调用相应的方法。它需要依赖继承和虚函数的机制来实现。在基类中声明虚函数,并在派生类中进行重写,从而使得在通过基类指针或引用调用虚函数时,根据实际指向的派生类对象来动态选择调用哪个函数。这种特性称为动态绑定或后期绑定。
在C++中,可以通过使用虚函数和指针/引用来实现动态多态。具体步骤如下:
1、在基类中声明一个虚函数(通过在函数声明前添加 virtual 关键字),该函数将在派生类中进行重写。
2、创建基类指针或引用,并将其指向派生类对象。
3、通过基类指针或引用调用虚函数,系统会根据实际指向的派生类对象来动态选择调用哪个函数。
#include <iostream>
using namespace std;
class Shape {
public:
virtual void draw() {
cout<<"Drawing a shape." <<endl;
}
};
class Circle : public Shape {
public:
void draw() override {
cout<<"Drawing a circle."<<endl;
}
};
class Rectangle : public Shape {
public:
void draw() override {
cout<<"Drawing a rectangle."<<endl;
}
};
int main() {
Circle circle; //创建了一个名为 circle 的 Circle 类对象
Rectangle rectangle;
Shape* shapePtr1 = &circle; //& 符号可以用于获取一个对象的地址
Shape* shapePtr2 = &rectangle;
shapePtr1->draw(); // 调用派生类的重写函数
shapePtr2->draw();
return 0;
}
在上述代码中,基类 Shape 声明了一个虚函数 draw()。派生类 Circle 和 Rectangle 分别重写了 draw() 函数。在 main() 函数中,通过基类指针 shapePtr1 和 shapePtr2 分别指向 Circle 和 Rectangle 对象,并调用 draw() 函数。由于该函数是虚函数且派生类进行了重写,因此会根据实际指向的对象类型来动态选择调用哪个函数。