多态分为两类:
1.静态多态:函数重载 和 运算符重载属于静态多态,复用函数名
2.动态多态:派生类和虚函数实现运行时多态
静态多态与动态多态的区别:
1.静态多态的函数地址早绑定 - 编译阶段确定函数地址
2.动态多态的函数地址晚绑定 - 运行阶段确定函数地址
#include <iostream> using namespace std; // 多态 // 动物类 class Animal { public: virtual void speak() { cout << "动物会叫" << endl; } }; class Dog: public Animal { // Animal &animal = dog; 是允许的 public: void speak() { cout << "狗:汪汪" << endl; } }; void Speak(Animal &animal) { animal.speak(); } void test() { Dog dog; Speak(dog); } int main() { Dog dog; Speak(dog); // 由于函数早绑定,在编译阶段就确定了函数地址,所以输出结果为 动物会叫 // 如果想执行Dog,那么这个函数地址应该晚绑定,在 Animal 中的 speak 前加 virtul 关键字 // 添加 virtual 后,输出结果为 狗:汪汪 return 0; } /* 动态多态满足条件 1.有继承关系 2.子类要重写父类中的虚函数,重写时可以不写 virtual 关键字 重写:函数返回值类型,函数名,参数列表,完全相同 动态多态的使用: 父类的指针或者引用执行子类对象 e.g Animal &animal = dog; */
指针只占用四个字节的空间
多态的优点:
代码组织结构清晰;可读性强;利于前期和后期的扩展和维护