上一节讲完赋值兼容规则后,编程入门中继承与派生的部分就讲完了。今天开始讲解面向对象设计中的多态性。

       鸡啄米先介绍一个概念:消息。消息在C++编程中指的是对类的成员函数的调用。多态就是指相同的消息被不同类型的对象接收会引起不同的操作,直接点讲,就是在不同的情况下调用同名函数时,可能实际调用的并不是同一个函数。

       以“+”运算符为例,“+”可以实现整型变量之间、浮点型变量之间的加法运算,也可以实现不同类型变量之间的加法运算,例如整型变量和浮点型变量相加,这时需要先将整型变量转换为浮点变量再进行加法运算。同样是加法运算,参与运算的变量类型不同时,进行加法运算的方式也不同。这就是多态的典型例子。

       1.多态的类型

       多态性有四种类型:重载多态、强制多态、参数多态和包含多态。

       前两种可以统称为专用多态。之前鸡啄米讲过普通函数的重载和类的成员函数的重载,它们都属于重载多态。上面说的整型变量和浮点型变量相加时,需要先把整型变量强制转换为浮点型再进行加法运算,这就是强制多态。从概念上讲,强制多态就是将一个变量的类型进行转换,以满足一个函数运算的要求。

鸡啄米:C++编程入门系列之四十四(多态性:多态的概念和类型)

       后两种统称为通用多态。前面讲过的类模板将类型参数化,设定了确定的类型才可以实例化。由类模板实例化得到的所有类都有相同的操作,但是被操作对象的类型不同,这就是参数多态。包含多态是指类族中不同类的同名成员函数实现的操作不相同。包含多态一般通过虚函数来实现。虚函数在我们进行软件开发设计时会经常用到,初学者在有了一定经验后会越来越多的使用虚函数。

       鸡啄米后面会主要讲重载多态的运算符重载和包含多态的虚函数。

       2.多态的实现

       从多态实现的阶段不同来分类可以分为编译时的多态和运行时的多态。

       编译时的多态是指在编译的过程中就确定了具体调用同名函数中的哪个函数,而运行时的多态则是在程序运行过程中才动态的确定调用的具体函数。这种确定调用同名函数的哪个函数的过程就叫做联编或者绑定。鸡啄米一般称其为绑定。绑定实际上就是确定某个标识符对应的存储地址的过程。按照绑定发生的阶段的不同可以分为:静态绑定和动态绑定。静态绑定就对应着编译时的多态,动态绑定对应运行时的多态。

       如果绑定过程发生在编译链接阶段,则称为静态绑定。在编译链接过程中,编译器根据类型匹配等特征确定某个同名标识究竟调用哪一段程序代码,也就是确定通过某个同名函数到底调用哪个函数体。1中的四种多态中有三种需要静态绑定:重载多态、强制多态和参数多态。

       而如果绑定过程发生在程序运行阶段,则成为动态绑定。在编译链接过程中无法确定调用的具体函数,就要等到程序运行时动态确定。包含多态就需要使用动态绑定实现。

       因为重载、强制和参数多态有关的内容鸡啄米前面都讲过,可能大家对它们的理解还不算困难。但是包含多态可能很难理解,但是没关系,后面鸡啄米会细讲包含多态的虚函数,大家会明白包含多态的强大。最后仍然是欢迎大家到鸡啄米博客交流。