2014-03-25 61 views
0

我只是想了解下面這段代碼,但不能理解這兩行 最後。繼承存儲地址的派生

ptr = &D; 
ptr->show(); 

我實際上正在研究多態概念。這只是基礎知識。所以,請解釋一下它是如何工作的,以及爲什麼ptr-> show()在基地調用函數。

#include <iostream> 
using namespace std; 

class Base { 
    public: 
     void show() 
     { 
      cout << "This is the base\n"; 
     } 
}; 

class Derived : public Base { 
    public: 
     void show() 
     { 
       cout << "This is the derived\n"; 
     } 
}; 


int main() 
{ 
    Base B; 
    B.show(); 
    Derived D; 
    D.show(); 

    Base *ptr = &B; 
    ptr->show(); 

    ptr = &D; 
    ptr->show(); 

    return 0; 
} 

輸出

這是基本

這是所導出的

這是基本

這是基本

+1

'show'需要在基地虛擬 – fizzer

+0

是的,但我沒有正確理解它的概念我知道我會把虛擬在那裏,但你能解釋我在回答這個背後的概念和我已經問過的問題 – user3215228

回答

0

基地是一個簡單的類。

派生是一個繼承自Base的類。 (我們會說,衍生爲基地的女兒,基地是派生的母親)

讓我們看看inheritences的影響:

  • 在母親的所有方法是在女兒可
  • 如果在兩個班級(母親&女兒)中定義了一種方法,則將使用第一個方法。如果關鍵字virtual應用於該方法,則執行Exept。
  • 你可以操縱一個女兒類與母親類指針

B是從基地

Base B; 

Base類的調用方法展示一個實例

B.show(); 

d是一個實例from Derived

Derived D; 
類的

調用方法顯示派生

D.show(); 

創建指針初始化爲B對象的地址(基類)類基地

Base *ptr = &B; 

調用方法顯示的基類,原因PTR是一個基指針

ptr->show(); 

初始化指針PTR與d對象(派生類)

0的地址階級基礎的
ptr = &D; 

調用方法秀,原因是PTR基址指針

ptr->show(); 

爲什麼那樣工作?他爲什麼不叫Derived show method?

想象compilator算法...

你告訴他:「請叫方法顯示ptr指向類!」

所以價值ptr指向類型照顧(階級基礎)並關注方法展示。函數顯示是否具有虛擬關鍵字?

  • 不是嗎?所以我現在就叫它!

  • 是嗎?因此,我正在穿過所有的女兒,並拿出最後一個節目的定義,然後稱之爲!

你明白嗎?

如果您有任何問題,請聯繫我們!

+1

非常感謝,我非常瞭解它。 – user3215228

+0

感謝你:) –

1

成員函數被相應地調用來指針的靜態類型。如果在此情況下將函數show定義爲虛擬,則在由派生類的地址分配的ptr由於使用vptr進行間接調用而被調用時會調用它。

當您聲明ptr爲Base *ptr即它的靜態類型爲Base時,編譯器調用成員函數show Base中定義的成員函數show。

+0

你有什麼通過使用vptr間接調用?你可以進一步解釋 – user3215228

+2

@ user3215228當一個類有一個虛擬函數時,編譯器創建一個虛擬函數指針表。它使用這個表來調用它從這個表中加載函數地址的函數,並將控制權交給這個地址。 –