​C++中的多态及虚函数大总结​


文章目录

多态

多态可分为静态多态动态多态

一、静态多态

静态多态的实现在于静态联编,关联出现在编译阶段而非运行期,用对象名或者类名来限定要调用的函数,称为静态关联或静态联编。

常见有三种方法:

  1. 函数多态(函数与运算符的重载);
  2. 宏多态
  3. 模板多态。


我个人理解就是通过宏、模板生成代码、函数或运算符重载达到多态效果。


1.1 函数多态

1.2 宏多态

1.3 模板多态

二、动态多态

对于动态多态的实现是运行阶段把虚函数和类对象绑定在一起的,即动态联编,动态绑定。具体的说,通过一个指向基类的指针调用虚成员函数的时候,运行时系统将能够根据指针所指向的实际对象调用恰当的成员函数实现。


  • 动态绑定(动态多态),也称为“运行时绑定”,是指在执行期间(非编译期)判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。
  • 没有virtual修饰,不会发生动态绑定,因此只是运行的父类版本


2.1 父类引用指向子类对象(上转型多态)

多态需要注意的问题

C++ 作为一种面向对象语言,其最重要的一个特征(也是面向对象的最重要的特征之一)是多态和动态绑定。所谓动态绑定,也称为“运行时绑定”,是指在执行期间(非编译期)判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。

没有virtual修饰,不会发生动态绑定,因此只是运行的父类版本

CRTP 也被称为“静态多态”。有些时候,我们编写多态的代码,但是子类并不是运行时才能确定,而是编译时已经确定了(或者我们仅仅是为了重用部分代码才使用了多态机制)。在这种情况下,我们完全可以将“多态”的实现提前到编译期。