基本概念¶
多态¶
按照字面意思来看, 多态的意思是多种形态. 当面向对象时, 多态即继承同一基类时, 多个派生类产生多种形态. 具体表现就是不同派生类对相同的方法实现不同的功能.
C++的多态有两种:
- 静态多态: 编译时多态性, 通过 重载 函数实现.
- 动态多态: 运行时多态性, 通过 虚函数 与 覆盖 实现.
作用¶
封装使代码模块化, 继承扩展已经存在的代码, 目的都是为了代码重用. 而多态的目的是为了 接口重用 . 也就是说, 无论传递过来的是哪个类的对象, 函数都能通过同一个接口调用各个类自己的方法.
静态多态¶
静态多态指的是编译时产生的多态性, 同过 重载 实现.
重要
重载 发生在同一类中, 相同的方法有多种实现, 每种的参数个数或着类型都不相同.
编译时, 编译器根据代码中参数的不同分别调用不同的方法进行代码编译.
动态多态¶
动态多态是面向对象编程中常用的方法.
最常见的用法就是:
声明基类的指针, 指向任意一个派生类的对象, 调用基类中相应的 虚函数 , 相当于调用各个派生类中不同的函数.
常见的错误:
如果在基类中定义的并不是虚函数, 则利用基类指针调用相应函数的时候, 将总被限制在基类函数本身, 而无法 调用到派生类中被重写过的函数. 如果没有使用virtual
关键字声明虚函数, 则在编译时就已经将函数的调用固定在基类中.
简而言之:
- 有
virtual
才可能发生动态多态, 执行时根据类来调用派生类方法. - 没有
virtual
调用就按照原类型调用.
重要
隐藏 是指派生类的函数屏蔽了与其同名的基类函数.
隐藏规则如下:
- 如果派生类与基类函数同名, 且没有
virtual
关键字, 就会发生隐藏. - 如果派生类与基类函数同名, 且基类有
virtual
关键字, 则会发生 覆盖 , 即多态.
虚函数¶
- 虚函数
- 就是允许被派生类重新定义的成员函数, 派生类重新定义基类虚函数, 可以实现动态覆盖.
- 纯虚函数
- 是在基类中声明的虚函数, 它在基类中没有被定义, 但 强制 任何派生类都要定义自己的实现方法.
virtual void function() = 0;
Reference