2014-04-01 98 views
2

這是一個非常基本的問題,但我的C++技能有點生疏...重載函數

我有了一個成員函數,有3個參數,如基類:

class MyBaseClass 
{ 
public: 
    int func(int a, char b, int c); 
}; 

和重載用1參數版本該功能的派生類,例如:

class MyDerivedClass : public MyBaseClass 
{ 
public: 
    int func(float a); 
}; 

當我嘗試調用從基類的功能的派生類的對象上, 喜歡這個:

MyDerivedClass d; 
d.func(1, 'a', 0); 

編譯器抱怨說MyDerivedClass::func() does not take 3 arguments。這是真的,但我不應該通過派生類的對象訪問基類函數嗎?

我在做什麼錯?

+2

看到這個主題? http://stackoverflow.com/questions/1896830/why-should-i-use-the-using-keyword-to-access-my-base-class-method – taocp

回答

6

MyDerivedClass::func正在隱藏名稱MyBaseClass::func。你可以用using聲明解決這個問題:

class MyDerivedClass : public MyBaseClass 
{ 
public: 
    using MyBaseClass::func; 
    int func(float a); 
}; 
+0

我知道它必須是簡單的東西。自從我撣掉我的C++帽子已經很長時間了。我從來沒有見過'使用'關鍵字 - 是新的? –

+0

@JeffLoughlin'使用'從一開始就一直存在。它可以在C++ 11中做更多的事情,但上面顯示的用法是老派。 – juanchopanza

+0

大約12年前,我曾經是一個C-> C++轉換,然後大約3年後又回來了,所以我想我從來沒有機會在我短暫的C++經驗中學習'使用'。感謝您的解釋。 –

1

你可能打算申報方法MyBaseClass::func()virtual

但是,如果你真的想實現

當我嘗試從基類調用函數 派生類的對象,就像這樣

那麼,你可以嘗試

MyDerivedClass d; 
d.MyDerivedClass::func(3.14f); 

這編譯和作品,但似乎並沒有很好的設計。

編譯器抱怨MyDerivedClass::func()用不了3個 參數

這的確是真實的,每類定義,MyDerivedClass :: FUNC()只有一個參數。

+0

這不會改變任何東西(除非它可能對gcc產生有用的警告)。 – juanchopanza

0

添加「using Class :: func;」在MyDerivedClass中。

class MyDerivedClass : public MyBaseClass 
    { 
    public: 
     using MyBaseClass::func; 
     int func(float a); 
    };