2013-01-08 105 views
27

這可能是一個noob問題,對此很抱歉。我最近遇到了一個奇怪的問題,試圖在C++,函數重載和繼承中混淆一些高級的東西。在繼承類中的函數重載的C++問題

我會舉一個簡單的例子來說明問題;

有兩類,classAclassB,如下所示;

class classA{ 
    public: 
     void func(char[]){};  
}; 

class classB:public classA{ 
    public: 
     void func(int){}; 
}; 

據我所知classB現在應該posses 2個func(..)功能,由於超載不同的參數。

但是,當在主要方法中嘗試此操作時,

int main(){ 
    int a; 
    char b[20]; 
    classB objB; 
    objB.func(a); //this one is fine 
    objB.func(b); //here's the problem! 
    return 0; 
} 

它給出錯誤的方法void func(char[]){};這是在超類,classA,是不是INT派生類,classB可見。

我該如何克服這個問題?這不是在C++中如何重載?我是新來的C++,但在Java中,我知道我可以使用這樣的東西。

雖然我已經找到this thread其中有類似的問題,但我認爲這兩種情況是不同的。

回答

40

所有你需要的是一個using

class classB:public classA{ 
    public: 
     using classA::func; 
     void func(int){}; 
}; 

它不會搜索的基類func因爲它已經找到了一個在派生類中。 using語句將其他重載帶入同一個作用域,以便它可以參與重載解析。

9

大家都對這個問題的答案解釋,例如:

Why should I use the "using" keyword to access my base class method?

總之,編譯器將停止搜索匹配來自父類的方法,當它在當前類中找到匹配方法的名稱,即使該方法不兼容。我想這允許一些自動類型轉換工作更邏輯,而不需要重寫這麼多的父類方法。

+1

感謝您的回答+鏈接。我想知道C++人是否故意保存這個東西。有沒有優點?它感覺對我來說破壞了繼承的想法,不是嗎? – Anubis

+0

@Anubis,這只是重載解析的規則和「using」聲明的目的。 – chris

3

如果在派生類中重寫函數的一個變體,則需要覆蓋所有變體。您可以使用JLledo建議的內容,也可以在派生類中編寫函數的變體,該變體只調用基類的相同簽名的函數。

class classA{ 
    public: 
     void func(char[]){};  
}; 

class classB:public classA{ 
    public: 
     void func(int){}; 
     void func(char[]){}; 
}; 

void classB:func(char[] ch) 
{ 
    classA::func(ch); 
} 
-4

你必須通過int類型的參數在

objB.func(b); //here's the problem! 

BCS已經超負荷int參數

+0

您可以嘗試並提供更詳細的答案。 – easwee