2010-11-24 33 views
8

可能重複:
overloaded functions are hidden in derived class爲什麼我沒有得到任何匹配功能時,我繼承了這個功能

我有A類和B類(A的子類)

類A有功能

virtual void foo(int, int); 
virtual void foo(int, int, int); 

當我嘗試做B

類具有功能

virtual void foo(int, int); 

當我嘗試調用foo(INT,INT,INT)與類,因爲它說

編譯器不會讓我
no matching function for foo(int,int,int) 
candidate is foo(int,int); 
+0

發佈更多驗證碼。 – 2010-11-24 20:31:54

回答

9

之所以必須處理C++的名稱查找和重載解析的方式。 C++將從表達式類型開始並向上查找,直到找到與指定名稱匹配的成員。然後它將只考慮發現類型中具有該名稱的成員的重載。因此在這種情況下,它只考慮在B中聲明的foo方法,因此無法找到過載。

最簡單的補救措施是將using A::foo加入class B以迫使編譯器也考慮那些重載。

class B : public A { 
    using A::foo; 
    virtual void foo(int, int); 
}; 
2

B類中的覆蓋隱藏類A的方法具有相同的名稱。 (你對編譯器警告?大多數編譯器警告隱藏的虛方法。)

爲了避免這種情況,添加

using A::foo; 

B類(不論public/protected/private部分爲宜)。

1

使用

B b; 
b.A::foo(1,2,3); 

例如。

相關問題