2013-07-11 35 views

回答

3

正如其他人所寫,沒有歧義,因爲Derived::f(int)隱藏Base::f(int)。你可能正期待這是情況下,只有在沒有using聲明:

using Base::f; 

但躲在仍然適用。段落7.3.3 C++ 11標準規定的/ 15:

using聲明帶來從基類名轉換成一個派生類範圍,成員函數和 成員函數模板在派生類超控和/或隱藏的成員函數和成員函數 模板具有相同的名稱,參數類型列表(8.3.5),CV-資格,和REF-限定符(如果有的話)在 基類(而不是衝突)

它還提供了非常相似,你的一個例子(見如何表達p->f(1)不會導致混亂,並且D::f改爲採摘):

struct B { 
    virtual void f(int); 
    virtual void f(char); 
    void g(int); 
    void h(int); 
}; 

struct D : B { 
    using B::f; 
    void f(int); // OK: D::f(int) overrides B::f(int); 
    using B::g; 
    void g(char); // OK 
    using B::h; 
    void h(int); // OK: D::h(int) hides B::h(int) 
}; 

void k(D* p) 
{ 
    p->f(1); // calls D::f(int) 
    p->f(’a’); // calls B::f(char) 
    p->g(1); // calls B::g(int) 
    p->g(’a’); // calls D::g(char) 
} 
+0

+1有沒有做任何解釋,那是,他們爲什麼這樣做? – Belloc

+0

@ user1042389:我無法給你一個很好的答案。事實上,我不知道。我可以猜想,基本原理可能是,派生類中的函數仍然被認爲比基類中的版本「更具體或更合適」來解析調用,因此它被挑選出來而不是提高歧義性。但是,再一次,這只是一個瘋狂的猜測,你不應該把它看作是更多的東西:) –

2

派生類中的函數隱藏了基類中的函數。
這被稱爲陰影。

1

由於靜態類型的dDerived,和Derived::f(int)隱藏Base::f(int)

相關問題