一、类型
在引入多态之前,我们先来看一下多态的两种类型:
二、多态性的概念
多态一词最初来源于希腊语,意思是具有多种形式或形态的情形,在C++中是指同样的消息被不同类型的对象接收时导致不同的行为,这里讲的消息就是指对象的成员函数的调用,而不同的行为是指不同的实现。也就是调用了不同的函数。 概念的给出总是那么的抽象,我们来通过一个具体的例子来看看什么是多态:
#include<iostream> using namespace std; int Add(int left, int right) { return left + right; } char Add(char left, char right) { return left + right; } double Add(double left, double right) { return left + right; } int main() { Add(1, 2); Add('1', '2'); Add(1.2, 2.3); system("pause"); return 0; }
在此函数中,同样的消息加法运算,由于运行时传入的参数类型不同,就会调用不同类型的函数,也就是会有不同的行为响应。
多态性从系统实现的角度来讲可以划分为两类:静态多态(也叫编译时多态性)和动态多态(又称运行时多态性),以前学过的函数重载和运算符的重载属于静态多态性,在程序编译时就能决定调用的是哪一个函数,静态多态是通过函数的重载来实现的(运算符重载实际上也属于函数的重载)。动态多态性是程序运行过程中才动态地确定操作所针对的对象,运行时多态性是通过虚函数来实现的。下面我们就分别看一下静态多态和动态多态。
三、静态多态
静态多态:编译器在编译期间完成的,编译器根据函数实参的类型(可能会进行隐式类型转换),可推
断出要调用那个函数,如果有对应的函数就调用该函数,否则出现编译错误。
四、动态多态
即不同对象调用相同命令,相应不同的动作。动态多态是以封装和继承为基础的。
看下面一个例子:
class Shape//形状类 { public: double calcArea() { cout<<"calaArea"<<endl; return 0; } }; class circle:public Shape//圆类 { public: circle(double r);//构造函数 double calcArea(); private: double m_dR; }; double circle::calcArea() { return 3.14*m_dR*m_dR; } class Rect:public Shape//矩形类 { public: Rect(double w,double h);//构造函数 double calcArea(); private: double m_dw,m_dh; }; double Rect::calcArea() { return m_dw*m_dh; }
定义一个父类形状类和两个子类圆类和矩形类(计算面积)。
函数实现:
1 int main(void) 2 { 3 Shape *shape1=new circle(4.0); 4 Shape *shape2=new Rect(3.0,5.0); 5 shape1->calcArea(); 6 shape2->calcArea(); 7 return 0; 8 }
然而运行时将执行两次:
1 cout<<"calaArea"<<endl;
并不是我们想要的结果。
在此进入虚函数:动态多态的实现。
、关键字:virtual->虚函数。
用刚才的例子说明问题。
![](https://images2018.cnblogs.com/blog/1355143/201807/1355143-20180724112156411-1393868318.png)
给计算面积的函数加上virtual关键字。
![](https://images2018.cnblogs.com/blog/1355143/201807/1355143-20180724112246403-1751752044.png)
![](https://images2018.cnblogs.com/blog/1355143/201807/1355143-20180724145143635-1860538317.png)
![](https://images2018.cnblogs.com/blog/1355143/201807/1355143-20180724145325067-1928803232.png)
这边可以不加virtual关键字,系统会默认加上。
通过以上虚函数的方法就可以实现多态。