基本概念

多态

按照字面意思来看, 多态的意思是多种形态. 当面向对象时, 多态即继承同一基类时, 多个派生类产生多种形态. 具体表现就是不同派生类对相同的方法实现不同的功能.

C++的多态有两种:

  • 静态多态: 编译时多态性, 通过 重载 函数实现.
  • 动态多态: 运行时多态性, 通过 虚函数覆盖 实现.

作用

封装使代码模块化, 继承扩展已经存在的代码, 目的都是为了代码重用. 而多态的目的是为了 接口重用 . 也就是说, 无论传递过来的是哪个类的对象, 函数都能通过同一个接口调用各个类自己的方法.

静态多态

静态多态指的是编译时产生的多态性, 同过 重载 实现.

重要

重载 发生在同一类中, 相同的方法有多种实现, 每种的参数个数或着类型都不相同.

编译时, 编译器根据代码中参数的不同分别调用不同的方法进行代码编译.

动态多态

动态多态是面向对象编程中常用的方法.

最常见的用法就是:

声明基类的指针, 指向任意一个派生类的对象, 调用基类中相应的 虚函数 , 相当于调用各个派生类中不同的函数.

常见的错误:

如果在基类中定义的并不是虚函数, 则利用基类指针调用相应函数的时候, 将总被限制在基类函数本身, 而无法 调用到派生类中被重写过的函数. 如果没有使用 virtual 关键字声明虚函数, 则在编译时就已经将函数的调用固定在基类中.

简而言之:

  1. virtual 才可能发生动态多态, 执行时根据类来调用派生类方法.
  2. 没有 virtual 调用就按照原类型调用.

重要

隐藏 是指派生类的函数屏蔽了与其同名的基类函数.

隐藏规则如下:

  • 如果派生类与基类函数同名, 且没有 virtual 关键字, 就会发生隐藏.
  • 如果派生类与基类函数同名, 且基类有 virtual 关键字, 则会发生 覆盖 , 即多态.

虚函数

虚函数
就是允许被派生类重新定义的成员函数, 派生类重新定义基类虚函数, 可以实现动态覆盖.
纯虚函数
是在基类中声明的虚函数, 它在基类中没有被定义, 但 强制 任何派生类都要定义自己的实现方法.
virtual void function() = 0;

Reference

C++ 三大特性之多态

C++ 多态