2017-04-25 53 views
1

我通常是一個C#人,它處理這個問題,主要是在處理「最佳匹配」呼叫。我現在試圖在C++中做類似的事情,但是得到一個編譯錯誤。長話短說,這是方法超載覆蓋的組合。C++ Overload&Override - 無法初始化類型爲''的參數,類型爲'''

Bar類:公共富{} //內容並不真正的問題在這裏

class Base 
{ 
public: 
    virtual void Do(Foo* foo) { } 
    virtual void Do(Bar* bar) { } 
}; 
class Derived : public Base 
{ 
public: 
    virtual void Do(Bar* bar) { } 
} 


Foo* foo = new Foo(); 
Derived* d = new Derived(); 
d->Do(foo); //cannot initialize a parameter of type 'Bar*' with an rvalue of type 'Foo*' 

所以,它試圖解決對的方法Derived的方法,而不是承認的基類實現一個有效的匹配。再次,C#找到基本方法。 C++不能這樣做,還是我錯過了一些東西?

回答

4

派生類中的函數隱藏了任何在基類中具有相同名稱的函數(即使您重寫了虛函數)。要取消隱藏其他過載,請使用「using」聲明:

class Derived : public Base 
{ 
public: 
    virtual void Do(Bar* bar) { } 
    using Base::Do; 
}; 
+0

TIL,謝謝。目前我正在使用手機,但Java是否以同樣的方式工作? – Qix

+0

Java在此解析方式與C#相同,因此不需要額外的語法來避免「名稱隱藏」。 –

相關問題