从基类中重新声明成员以避免名称隐藏

如果在类范围内发生 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
}