從基類中重新宣告成員以避免名稱隱藏
如果在類範圍內發生 using 宣告,則只允許重新宣告基類的成員。例如,在類範圍內不允許使用 using std::cout
。
通常,重新宣告的名稱是隱藏的名稱。例如,在下面的程式碼中,d1.foo
僅引用 Derived1::foo(const char*)
,並且將發生編譯錯誤。Base::foo(int)
的功能根本不被考慮。然而,d2.foo(42)
很好,因為 using-declaration 將 Base::foo(int)
帶入了 Derived2
中名為 foo
的實體集。名稱查詢然後找到 foo
s 和過載解析度選擇 Base::foo
。
struct Base {
void foo(int);
};
struct Derived1 : Base {
void foo(const char*);
};
struct Derived2 : Base {
using Base::foo;
void foo(const char*);
};
int main() {
Derived1 d1;
d1.foo(42); // error
Derived2 d2;
d2.foo(42); // OK
}