2014-02-18 147 views
5

方法funcDerivedClass覆蓋方法func及其所有重載從BaseClass類的方法覆蓋另一個類的所有方法

#include <cstdio> 

class BaseClass 
{ 
    public: 
     void func(int a){puts("BaseClass::func(int)");}; 
     void func(int a, int b){puts("BaseClass::func(int, int)");}; 
     void func(int a, int b, int c){puts("BaseClass::func(int, int, int)");}; 
     //... 
}; 

class DerivedClass : public BaseClass 
{ 
    public:   
     void func(int a){puts("DerivedClass::func(int)");} 
     //...    
}; 

int main() 
{   
    DerivedClass obj; 
    obj.func(0); 
    obj.func(0, 0);  // error 
    obj.func(0, 0, 0); // error  

    return 0; 
} 

我怎樣才能解決這個代碼最終在屏幕上推導:

DerivedClass::func(int) 
BaseClass::func(int, int) 
BaseClass::func(int, int, int) 

編輯1 在功能main不應該改變什麼

回答

5

派生類的成員函數沒有覆蓋基類的人,你可以取消隱藏它們,隱藏他們。爲了將他們全部範圍,使用using聲明:

class DerivedClass : public BaseClass 
{ 
    public:   
     void func(int a){puts("DerivedClass::func(int)");} 
     using BaseClass::func; 
     //...    
}; 

Live example

2

這是由設計:現象被稱爲「名稱隱藏」。

[簡短的回答]:

C++不喜歡這個主意,一個長期的行爲,調用一個基本功能,使用一組特定的參數,可以在一個子類進行修改和選擇以來隱藏每個基類中的所有過載來解決這個問題。

[龍答案]這裏: https://stackoverflow.com/a/1629074/1938163


作爲一種變通方法,就可以把對象到合適的基地,叫你需要的功能(有鑄造罰款雖然),或更好的通話需要直接通過指定其基類的功能

int main() 
{   
    DerivedClass obj; 
    obj.func(0); 
    obj.BaseClass::func(0,0); 

    return 0; 
} 

Live Example

或與「使用指令」

class DerivedClass : public BaseClass 
{ 
    public:   
     void func(int a){puts("DerivedClass::func(int)");} 
     using BaseClass::func; 
     //...    
}; 

Live Example

+0

'不需要dynamic_cast'。可以用'obj.BaseClass :: func(0,0);'完成相同的操作。此外,問題是如何設計這兩個類,以便'func'可以直接在'obj'上調用。 – iavr

+0

你說得對,我也會添加那個。謝謝。 –