多态性概述

多态性

多态性是面向对象程序设计的重要特性之一,从字面意思上可以简单理解就是:多种形态,多个样子。其实本质意思也是这样,在面向对象程序设计中,指同样的方法被不同对象执行时会有不同的执行效果。

在具体来说,多态的实现又可以分为两种:编译时多态和运行时的多态。前者是编译的时候就确定了具体的操作过程。后者呢是在程序运行过程中才确定的操作过程。这种确定操作过程的就是联编,也称为绑定。

联编在编译和连接时确认的,叫做静态联编,前面我们学习的函数重载、函数模板的实例化就属于这一类。

另一种是在运行的时候,才能确认执行哪段代码的,叫做动态联编,这种情况是编译的时候,还无法确认具体走哪段代码,而是程序运行起来之后才能确认。

两者相比之下,静态联编由于编译时候就已经确定好怎么执行,因此执行起来效率高;而动态联编想必虽然慢一些,但优点是灵活。

两者各有千秋,有各自不同的使用场景。政策法规

下面,我们围绕静态联编,给大家举一个简单例子:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

/**************************************

//Des:C++教程demo

//Author:Huang

//Copyright:www.dotcpp.com

//Date:2017/12/20

**************************************/

#include <iostream>

using namespace std;

#define PI 3.1415926

  

class Point

{

private:

    int x,y;

  

public:

    Point(int x=0,int y=0)

    {

        this->x = x;

        this->y = y;

    }

    double area()

    {

        return 0.0;

    }

};

class Circle:public Point

{

private:

    int r;

public:

    Circle(int x,int y,int R):Point(x,y)

    {

        r = R;

    }

    double area()

    {

        return PI*r*r;

    }

};

  

int main()

{

  

    Point A(10,10);

    cout<<A.area()<<endl;

    Circle B(10,10,20);

    cout<<B.area()<<endl;

    Point *p;

    p = &B;

    cout<<p->area()<<endl;

    Point &pp=B;

    cout<<pp.area()<<endl;

    return 0;

  

}

定义了两个类,一个圆点类,一个派生出来的圆类,可以看到主函数的代码,四个输出面积的结果,结果如下:

601.png

大家可以对照代码理解四个输出

第一个cout输出A的面积,是Point类中的area方法,面积为0,没有问题。

第二个cout输出B的面积,很明显是派生类Circle的area方法,面积自然按公式计算得出1256.64的值,也没问题。

第三个cout输出的是Point类型指针p指向的Circle类对象的area方法,它输出了0很明显是执行了Point类里的area方法。这里C++实行的是静态联编,即在编译的时候就依据p的类型来定执行哪个area,因此是0

第四种cout也同理,把Circle类型的对象赋给Point类型的引用,C++同样实行静态联编,也输出0

很明显,这不是我们更期望的结果,实际上,对于指针、引用,我们更希望执行实际对象的方法,而不是因为这个指针、引用的类型而盲目的确定。这就是如果这么写存在的问题。

如果想达到我们的要求,即无论指针和引用为什么类型,都以实际所指向的对象为依据灵活决定。那么就要更改这种默认的静态联编的方法,采用动态联编,即在运行的时候灵活决定。

下一节,虚函数为大家详细解释!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值