C++: using

2018-08-29  本文已影响2人  赵伯舟

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力不能及的

上一篇 下一篇

猜你喜欢

热点阅读