2013-07-05 48 views
2
#include <iostream> 

using namespace std; 

class Base { 
public: 
virtual void some_func(int f1) 
{ 
cout <<"Base is called: value is : " << f1 <<endl; 
} 
}; 

class Derived : public Base { 
public: 
virtual void some_func(float f1) 
{ 
cout <<"Derived is called : value is : " << f1 <<endl; 
} 
}; 


int main() 
{ 
int g =12; 
float f1 = 23.5F; 

Base *b2 = new Derived(); 
b2->some_func(g); 
b2->some_func(f1); 
return 0; 

} 

輸出是:首要職能++

Base is called: value is : 12 
Base is called: value is : 23 

爲什麼第二個呼叫b2->some_func(f1)調用Base類的功能,即使是浮在Derived類的說法提供一個版本?

+0

有一個新的C++ 11關鍵字'override'。把它放在'Derived'方法簽名'some_func'的末尾,這個錯誤信息會有幫助。 – Yakk

+0

永遠不要忘記刪除堆指針。 –

回答

2

您對覆蓋重載感到困惑, 對於重寫,函數的簽名必須保持相同。 請再次檢查C++文檔..希望這有幫助

+0

+1:雖然你沒有說清楚,但我明白什麼時候意識到它是超載。 – johnchen902

+0

起初我認爲這與他實例化他的課程的方式(使用b2)有關。所以,如果我理解正確(我不知道在c + +)他重寫類的基地,但重載函數some_func ???如果這是正確的,我在網上找到了關於如何覆蓋類(矩形 - >框...)的示例,但是我們如何覆蓋函數 – user2497624

+0

,您可以通過覆蓋該類中具有相同簽名的函數覆蓋該類,if您不要在派生類中重寫函數,派生類將不會提供除定義新類型之外的任何其他行爲。 –

4
  1. 它沒有被實際覆蓋,因爲它的參數沒有相同的類型。
  2. 因爲它沒有被覆蓋,所以你的指針Base只知道int方法,所以它執行縮小轉換(應該有一個警告)並且調用Base::some_func(int)
+0

感謝您的回答。 「隱藏功能」會在這裏出現嗎?我記得函數隱藏是關於在派生類中具有相同的函數名稱而不管簽名。我試着做Derived d; d.some_func(克);它編譯。 – user2553620