美文网首页
C++: using

C++: using

作者: 赵伯舟 | 来源:发表于2018-08-29 11:27 被阅读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力不能及的

    相关文章

      网友评论

          本文标题:C++: using

          本文链接:https://www.haomeiwen.com/subject/skehwftx.html