然后我们再来看看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
?
然后再去看一下总结.