正如其他人所寫,沒有歧義,因爲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)
}
+1有沒有做任何解釋,那是,他們爲什麼這樣做? – Belloc
@ user1042389:我無法給你一個很好的答案。事實上,我不知道。我可以猜想,基本原理可能是,派生類中的函數仍然被認爲比基類中的版本「更具體或更合適」來解析調用,因此它被挑選出來而不是提高歧義性。但是,再一次,這只是一個瘋狂的猜測,你不應該把它看作是更多的東西:) –