天天看點

c++ 多态 運作時多态和編譯時多态_cpp和java中多态的了解

今天寫一些小技巧幫助了解cpp和java裡的多态,因為c++和java在多态的實作上,稍微有一點點不同,是以這裡也會列出

兩者的不同,以免有時候會混淆。

多态是所有面向對象的程式設計語言中非常重要的一個特性,多态的實作,可以允許在程式運作過程中,父對象根據目前賦給他值的子對象和特性決定調用自己的方法還是子

類中複寫的方法。

c++ 多态 運作時多态和編譯時多态_cpp和java中多态的了解

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多态

c++ 多态 運作時多态和編譯時多态_cpp和java中多态的了解

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++進階大牛直播講解知識點,分享知識,多年工作經驗的梳理和總結,帶着大家全面、科學地建立自己的技術體系和技術認知!

c++ 多态 運作時多态和編譯時多态_cpp和java中多态的了解

繼續閱讀