2014-12-08 41 views
1

這是簡單的代碼我處理,以瞭解繼承下來鑄造了鑄件等類繼承和上溯造型在C++

class A 
{ public: 
    void p() {cout << 「A::p\n」;} 
    virtual void q() {cout << 「A::q\n」;} 
}; 

class B : public A 
{ public: 
    void p() { cout << 「B::p\n」;} 
    void q() { cout << 「B::q\n」;} 
}; 

int main() 
{ A* a1 = new B; 
    a1 -> p(); 
    a1 -> q(); 
} 

其次是我的預期輸出

B::p 
B::q 

以下是實際輸出

A::p 
B::q 

我的理解是,B類是繼承類A.然後我在主體中,我們創建了一個指向A類的指針,並將它的引用設置爲B.因此,當我們調用函數p()和q()時,我期望B類內部的任何內容都可以打印。

任何人都可以澄清我的誤解嗎?

+1

您正在調用基類指針上的非虛方法 - 您爲什麼期望派生類的重寫被調用?這正是「虛擬」的意義所在 - 「A :: p」不是。 – 2014-12-08 04:37:51

+1

你究竟在哪裏上傳任何東西? – Blindy 2014-12-08 04:39:30

+0

@Bindind:在'A * a1 = new B;'中。從指針到派生到指向基礎的指針(無論是隱式還是其他)通常俗稱爲「向上」(因爲您正在向上「繼承」繼承層次結構)。反向 - 總是顯式的 - 投射然後是「低調」。 – 2014-12-08 05:03:19

回答

2

你會發現這兩種方法之間的區別在於,一個被標記virtual基類A,另一種是不:

方法Q被定義爲

virtual void q() 

在基類,而p是隻是

void p() 

因此,

A* a1 = new B; 
a1 -> p(); ... Uses a1's type to determine the method, statically 
a1 -> q(); ... Uses virtual method table to determine the method at run time