从基类中重新声明成员以避免名称隐藏
如果在类范围内发生 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
}