C+学习之多态篇(虚函数)

一、什么事多态?

多态的定义:相同对象收到不同消息或不同对象收到相同消息时产生不同的动作。

二、多态分类:

定义不太好理解,其实或字前后说明了两个不同类型的多态形式:即静态多态(早绑定)和动态多态(晚绑定)。

1.静态多态(早绑定)

看下图中代码:

两个calcArea()函数互为重载,互为重载的函数在main()函数中调用的时候会根据参数的不同来调用各自的函数,这种调用关系是很早就确定下来的,即在程序运行之前,在编译阶段就已经确定下来要使用哪个函数了,这种情况就叫做早绑定或静态多态。

C+学习之多态篇(虚函数)_第1张图片

C+学习之多态篇(虚函数)_第2张图片

2.动态多态


C+学习之多态篇(虚函数)_第3张图片

动态多态的一个特性就是用父类的指针去指向子类的对象,并用父类的指针去调用相应的calcArea()函数去执行求面积的操作,如果父类的calcArea()函数不是virtual,那么下面的调用代码只会调用父类的calcArea()函数,没有实现多态;如果父类的calcArea()函数已经声明为virtual的,那么下面的调用代码就会调用各个子类的calcArea()函数,即对不同的子类对象实行相同的指令,做出了不同的动作响应。

注意:

(1)父类的calcArea()函数必须和子类的calcArea()函数返回值参数名称都一模一样才行,不然无法构成多态;

(2)父类的calcArea()函数声明为virtual以后,虚的特性是可以继承的,即子类的calcArea()函数写不写virtual,都已经是虚函数了,但是好的习惯是写上,明了。


C+学习之多态篇(虚函数)_第4张图片

多态几个特点简单归结如下:

(1)多态具体到语法是指:使用父类指针指向子类对象,并可以通过该指针调用子类的方法;

(2)产生多态的基础是存在继承关系,没有继承就没有多态;

(3)必须使用virtual才能在多个子类之间建立多态关系。


你可能感兴趣的:(C+学习之多态篇(虚函数))