2012-11-29 66 views
0

可能重複:
C++: rationale behind hiding rule編譯器如何實現繼承?

假設我有一個代碼:

class A 
{  
    public: 
    void f(int s) {} 
}; 



class B:public A 
{  
    public: 
    void f() {} 
}; 

int main() 
{  B ob; 
    ob.f(4); 
} 

那麼在這種情況下,編譯器會生成一個錯誤,「爲號召'沒有匹配功能B :: f(int)'「 但是B類已經繼承了A,因此B必須具有」void f(int s)「函數。不知道爲什麼編譯器在這裏產生錯誤?

+0

您不應該問「編譯器如何」,而是「C++中的規則是什麼......」。 –

回答

5

這是因爲B定義了不同的f,其隱藏A繼承了f。如果你想在B都有效(有可能),你必須把它納入範圍與使用聲明

class B : public A 
{ 
    void f() {} 
    using A::f; 
}; 

此行爲[class.member.loopkup]規定,特別是paragrah 4 。

+0

也就是說,如果你想用'B :: f()'重載'A :: f(int)',你必須執行上述操作。 –

+0

+1「隱藏」在這裏是正確的術語。 –

3

在聲明中Bvoid f(),這void f(int)A繼承。你可以把它放回範圍與using

class B: public A 
{  
public: 
    void f() {} 
    using A::f; 
}; 
+0

@LuchianGrigore:謝謝,回覆更新。 – NPE

+0

這兩個答案非常相似。 –