多态可以分为两类:
静态多态:函数重载和运算符重载属于静态多态。静态多态被称为早期绑定(Early Binding),在编译阶段确定函数地址。
动态多态:派生类和虚函数实现运行时候多态。动态多态是在运行阶段确定函数地址,也被称为晚期绑定(Late Binding)。
虚函数是在基类中声明为虚函数的函数,在派生类中可以重写该函数。通过基类指针或引用调用虚函数时,会根据指向的对象的实际类型来调用相应的函数。
例子:
#include <iostream>
using namespace std;
class Animal {
public:
//speak()就是虚函数
//函数前面加上virtual关键字,变成虚函数,那么编译器在编译的时候就不能确定函数调用了
virtual void speak() {
cout << "动物发出了声音" << endl;
}
};
class Cat : public Animal {
public:
void speak() override {
cout << "小猫喵喵叫" << endl;
}
};
class Dog : public Animal {
public:
void speak() override {
cout << "小狗汪汪叫" << endl;
}
};
int main() {
Animal* animal1 = new Cat();
Animal* animal2 = new Dog();
animal1->speak();
animal2->speak();
delete animal1;
delete animal2;
return 0;
}
新建了animal1,animal2并且赋值调用函数后,对他们手动进行delete操作。
相关概念:
重写(Override):是面向对象编程中的一个概念,它指的是在派生类中重新定义继承自基类的成员函数,使其在派生类中具有不同的实现。
当派生类定义了一个与基类中同名、同参数列表、同返回类型的成员函数时,这个派生类的函数就被称为重写函数(Overridden Function)。
多态满足条件:
①有继承关系
②子类重写父类中的虚函数
多态使用:父类指针或引用指向子类对象