C++中using
关键字一般有三种用处:
1. 用于命名空间
用于引入定义于别处的名称到此 using 声明出现的声明性区域,典型如:
using namespace std;
具体的用法可参见:命名空间
2. 用于类成员
using
声明引入基类成员到派生类定义,例如暴露基类的受保护成员为派生类的公开成员, 若名称是基类的重载成员函数之名,则引入带该名称的所有基类成员函数。若派生类已有同名、参数列表及限定的成员,则派生类成员隐藏或覆写引入自基类的成员(不与之冲突)
#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()
}
详细可参考链接
3.用于类型别名和别名模版
3.1 用于类型别名
在此种情况下与typedef
作用一致,其不引入新类型,且不能更改既存类型名的含义
3.2 用于别名模板
别名模板是特化时等价于以别名模板实参替换type-id
中形参的结果:
template<class T>
struct Alloc { };
template<class T>
using Vec = vector<T, Alloc<T>>; // type-id 为<T, Alloc<T>>
Vec<int> v; // Vec<int> 同 vector<int, Alloc<int>>
此种情况是typedef
力不能及的
网友评论