多态分为两类:
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; */
指针只占用四个字节的空间
多态的优点:
代码组织结构清晰;可读性强;利于前期和后期的扩展和维护
在多态中,父类中的虚函数一般是无意义的,主要都是调用子类重写的内容,因此我们可以将虚函数改写为纯虚函数
virtual 返回值类型 函数名(参数列表) = 0;
当类中有了纯虚函数,那么这个类就被称为抽象类
抽象类特点
1.无法实例化对象 2.子类必须重写抽象类中的虚函数,否则也属于抽象类
浙公网安备 33010602011771号