2014-10-28 49 views
-2

考慮這種情況: 類BaseClass定義函數x()和y()。 x()調用y()。爲什麼派生對象不會在派生類中調用重定義函數?

類DerivedClass繼承自BaseClass並重新定義函數y()。

創建類DerivedClass的對象D並調用函數x()。

當調用x()時,使用哪個y(),是在BaseClass中定義的還是在DerivedClass中重定義的?

對象d調用中的BaseClass
函數X函數X()()調用在DerivedClass

函數調用函數Y()在BaseClass的,而不是函數y()在編譯時被綁定。
這是靜態綁定。

我不清楚爲什麼它的問題。如果調用函數X(通過對象D)並且對象D是派生類,那麼它不就是調用重新定義的類的D.Y()嗎?

這是我給出的樣本,我試圖弄清楚。

baseClass 
void x(); // calls y(); 
void y(); 


derivedClass 
void y(); 

main() 
derivedClass D; 
D.x(); 
+1

你能在代碼中顯示一個例子嗎?閱讀代碼比閱讀代碼描述更容易 – Brian 2014-10-28 20:01:16

+0

我添加了我的代碼。 – YelizavetaYR 2014-10-28 20:04:12

+1

這不是C++代碼 - 請提供一個工作示例 – 2014-10-28 20:11:49

回答

2

我的C++是生疏,但我給它一去:

您的代碼應該已經下

class BaseClass 
{ 
public: 
    void x() { 
     this->y(); 
    } 

protected: 
    void y() { 
     /* do stuff */ 
    } 
}; 

class DerivedClass : public BaseClass 
{ 
protected: 
    void y() { 
     /* do different stuff */ 
    } 
}; 


int main() { 
    DerivedClass d; 
    d.x(); 
} 

如果yBaseClass發虛的定義中,那麼它是當執行d.x()(其中dDerivedClass實例)時被調用的重載方法DerivedClass::y

爲了使y虛擬,使用virtual關鍵字,像這樣:

virtual void y() { /* do stuff */ } 

如果y使用virtual關鍵字BaseClass沒有定義,那麼它是BaseClass::y它獲取由x改爲調用。

爲了調用派生類的一個實例,一個重寫的基類的虛方法,必須使用完全限定的方法名稱:d.BaseClass::y(),而你的情況肯定不會沒有DerivedClass覆蓋x是可能的。

我理解你的問題嗎?

0

如果對象具有靜態類型(引用)D,則將調用D::y。如果它具有靜態類型(引用)BaseClass,則將調用BaseClass:y。就這麼簡單。

相關問題