四时宝库

程序员的知识宝库

C++_类和对象_C++多态_多态的基本语法_静态多态_动态多态_虚函数

然后我们再来看看C++中的多态,这里还要注意一点,就是在C++中是可以用多继承的,

但是java.不行,只能实现多个接口,不能继承多个类.这让c++会更加灵活一点.


可以看到,上面说了,在c++中,分为静态多态也叫函数地址早绑定,和动态多态,也叫函数地址晚绑定

这些在java中是没有的,java中只是有多态.不区分,静态多态,动态多态.

?

通过例子说明,可以看到,上面我们写了一个动物类,提供了一个spreak方法

然后我们写了一个cat类,继承animal类,同样也是写了一个

spreak方法.

?

然后我们再去写一个doSpreak,全局函数

参数是,传入一个animal的引用,可以看到传入的是父类对吧.

然后去调用这个父类的spreak方法

?

然后我们写个测试方法,test01

然后新建cat对象,然后调用doSpreak(cat);这里doSpreak接收的是

animal对象,但是我们传入的是他的子类对吧.这样的话,打印会打印出来

父类的,动物在说话,还是小猫在说话呢

?

可以看到c++也是允许,父类的参数,直接传入子类的对象的.

?

这里我们给父类的参数,传入子类的对象去看看结果

?

执行,可以看到,打印出的是父类的内容对吧

这是怎么回事呢?

我们java,如果这样写会打印,子类的内容对吧.我们传入的是

小猫对象,怎么打印的是父类的内容呢?

?

可以看到上面的这种,情况的原因,就是因为,我们用了地址早绑定.

上面的这种多态的实现方式,就叫做.静态绑定

?

如果,我们想执行让传入的cat说话的话,那么这里就不能用,地址早绑定,

就需要在运行阶段,进行绑定地址.进行地址晚绑定.

?

这个时候,我们需要,这样做,在父类中,的方法前面,添加一个virtual关键字.

让这个父类的函数,变成一个虚函数.

?

这样,我们再去执行看看,可以看到,结果就是,小猫在说话了

什么这种,采用virtual关键字,使得父类的方法,变成虚函数的方式,就是地址晚绑定,

也叫做动态多态.

?

然后我们再去写一个dog类,也是继承animal类

然后,也写一个spreak方法.

?

然后我们在test01测试方法中,再去写上dog对象,然后,调用doSpreak方法,传入dog对象

执行去看看

?

可以看到也没问题,都显示出来了对应的内容.

?

然后可以看到,虽然doSpreak的参数,是animal,但是我们传入的是cat,或者dog,然后

执行的结果,也就是cat和dog,里面的内容了,但是前提是,我们给父类的spreak函数,添加了

virtual,形成了虚函数.这样,我们再执行doSpreak的时候,就会形成地址晚绑定,也就是动态多态.

这样就能调用到,传入的对应的cat和dog的spreak方法了.

?

可以看到,上面总结了,动态多态,满足的条件.可以看到需要,有继承关系

子类需要重写父类虚函数.

?

这里注意,父类中的虚函数virtual,需要在子类中重写,

这里有个重写的概念,可以看到上面有说.

?

然后重写的时候,注意,前面的这个virtual关键字,可以加也可以不加,都是没问题的.

?

再去执行可以看到没问题对吧

?

可以看到,上面又说了一下,说动态的多态使用,参数写的是父类的指针或者是引用,当然现在我们用的是引用对吧,

传入的参数是子类的对象,然后实际执行的时候,也是子类的方法.

?

可以看到通过上面的动态多态,就实现了,父类的animal引用,指向了子类的对象,比如cat

?

然后再去看一下总结.












发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接