在类定义中
using 声明将基类成员引入到派生类的定义中,例如将基类的受保护成员暴露为派生类的公开成员。此情况下 嵌套名说明符 必须指名所定义的类的某个基类。若其名字是该基类的某个重载的成员函数的名字,则具有该名字的所有基类成员函数均被引入。若派生类已有具有相同名字、形参列表和限定的成员,则派生类成员隐藏或覆盖从基类引入的成员(不与之冲突)。
例1:
#include <iostream>
struct B {
virtual void f(int) { std::cout << "B::f\n"; }
void g(char) { std::cout << "B::g\n"; }
void h(int) { std::cout << "B::h\n"; }
protected:
int m; // B::m 为受保护
typedef int value_type;
};
struct D : B {
using B::m; // D::m 为公开
using B::value_type; // D::value_type 为公开
using B::f;
void f(int) { std::cout << "D::f\n"; } // D::f(int) 覆盖 B::f(int)
using B::g;
void g(int) { std::cout << "D::g\n"; } // g(int) 与 g(char) 均作为 D 成员可见
using B::h;
void h(int) { std::cout << "D::h\n"; } // D::h(int) 隐藏 B::h(int)
};
int main()
{
D d;
B& b = d;
// b.m = 2; // 错误,B::m 受保护
d.m = 1; // 受保护的 B::m 可作为公开的 D::m 访问
b.f(1); // 调用派生类 f()
d.f(1); // 调用派生类 f()
d.g(1); // 调用派生类 g(int)
d.g('a'); // 调用基类 g(char)
b.h(1); // 调用基类 h()
d.h(1); // 调用派生类 h()
}
对于函数h来说,b调用的还是基类的h(int),d调用的是子类的h(int)。
结果如下: