c++ 多态 运行时多态和编译时多态_cpp和java中多态的理解

今天写一些小技巧帮助理解cpp和java里的多态,因为c++和java在多态的实现上,稍微有一点点不同,所以这里也会列出

两者的不同,以免有时候会混淆。

多态是所有面向对象的编程语言中非常重要的一个特性,多态的实现,可以允许在程序运行过程中,父对象根据当前赋给他值的子对象和特性决定调用自己的方法还是子

类中复写的方法。

64ec3963bab20b806b51342bc7cbc292.png

1. c++多态

c++中可以通过现下面四组概念来帮助我们理解和判断多态:

  • 对象的静态类型
  • 对象的动态类型
  • 静态绑定
  • 动态绑定

直接看例子:

class A { } class B : public A { } class C : public A { } B* pB = new B(); //pB的静态类型是声明的类型B*,动态类型也是B* A* pA = pB; //pA的静态类型是它声明的类型A*,动态类型是pA所指向的对象pB的类型B* C* pC = new C(); pA = pC; // pA的动态类型现在更改为是C*

从上面的例子可以得到以下结论:

  1. 对象的静态类型是申明这个对象时所使用的类型,例如: A *pA
  2. 对象的动态类型是对象所指对象的类型,并且对象的动态类型可以更改
class A { void go(); virtual run();}class B : public A { void go(); virtual run();}B *pB = new B();A *pA = pB;

那么pA->go()和pB->go()调用的是同一个函数吗?

肯定不是的,因为go()是非虚函数,它是静态绑定的,编译时,编译器根据对象的静态类型选择使用哪一个函数。pA和pB的静态类型不同,所以调用的是各自类的go()函数

pA->run()和pB->run()调用的又是同一个函数吗?

是的,run()是虚函数,它是动态绑定的,绑定的是对象的动态类型,是在代码运行时才决定调用哪个函数。因为pA和pB的动态类型都是B,所以run()调用的是同一个函数。这也是

c++多态的实现的关键。

结论:

  1. 静态绑定的函数,它依赖于对象的静态类型,编译时决定
  2. 动态绑定的函数,它依赖于对象的动态类型,运行时决定
  3. c++中虚函数才会使用动态绑定,所以虚函数是c++中实现多态的关键

2. java多态

046f1920cf38ef2f4cda77cb136bc609.png

java的多态实现相对比较简单,因为JAVA没有虚函数,所以java中实现多态只需要有下面几个条件:

  1. 要有类的继承
  2. 要有方法的重写
  3. 要有父类对象引用子类对象

看个例子:

class animal { public void eat() {}}class cat extends animal { public void eat() {}}animal a = new cat();a.eat();

这里调用的eat()就是子类cat中的eat()方法。

有一点需要注意的是,java中的多态并不是一定要继承interface或abstract才能实现,继承普通的类也可以,这里可能有时候会弄混。

最后,想学习编程的小伙伴们可以关注+私信回复:“资料”就可以拿到一份我为大家准备的编程学习资料!

C语言

注:加.群要求

1、零基础,目前遇到困难不知从何下手可以加。

2、在公司待久了,过得很安逸,但跳槽时面试碰壁。需要在短时间内进修、跳槽拿高薪的可以加。

3、基础非常扎实,但对目前主流技术欠缺,需要突破技术瓶颈的可以加。

4、觉得自己很牛B,一般需求都能搞定。但是所学的知识点没有系统化,很难在技术领域继续突破的可以加。

5.企业一线C/C++高级大牛直播讲解知识点,分享知识,多年工作经验的梳理和总结,带着大家全面、科学地建立自己的技术体系和技术认知!

7383db654bb0cc109a74dc5902dd05d3.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值