一、类型
在引入多态之前,我们先来看一下多态的两种类型:
二、多态性的概念
多态一词最初来源于希腊语,意思是具有多种形式或形态的情形,在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 ;
}
};
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;
}
定义一个父类形状类和两个子类圆类和矩形类(计算面积)。
函数实现:
int main(void)
{
Shape *shape1=new circle(4.0);
Shape *shape2=new Rect(3.0,5.0);
shape1->calcArea();
shape2->calcArea();
return ;
}
然而运行时将执行两次:
cout<<"calaArea"<<endl;
并不是我们想要的结果。
在此进入虚函数:动态多态的实现。
、关键字:virtual->虚函数。
用刚才的例子说明问题。
给计算面积的函数加上virtual关键字。
这边可以不加virtual关键字,系统会默认加上。
通过以上虚函数的方法就可以实现多态。