C++学习笔记:多态篇之虚函数

一、类型

在引入多态之前,我们先来看一下多态的两种类型:

二、多态性的概念 

多态一词最初来源于希腊语,意思是具有多种形式或形态的情形,在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->虚函数。
用刚才的例子说明问题。

给计算面积的函数加上virtual关键字。



这边可以不加virtual关键字,系统会默认加上。



通过以上虚函数的方法就可以实现多态。
 
 
 

猜你喜欢

转载自www.cnblogs.com/luxiansen/p/9360027.html