從基類中重新宣告成員以避免名稱隱藏

如果在類範圍內發生 using 宣告,則只允許重新宣告基類的成員。例如,在類範圍內不允許使用 using std::cout

通常,重新宣告的名稱是隱藏的名稱。例如,在下面的程式碼中,d1.foo 僅引用 Derived1::foo(const char*),並且將發生編譯錯誤。Base::foo(int) 的功能根本不被考慮。然而,d2.foo(42) 很好,因為 using-declarationBase::foo(int) 帶入了 Derived2 中名為 foo 的實體集。名稱查詢然後找到 foos 和過載解析度選擇 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
}