コンテンツにスキップ

最終更新:2026-10-12

C++ using 宣言とエイリアス

著者について:

個人公式アカウント(WeChat):

wechat

基本的な使用法

ローカルとグローバルのusingについて、具体的な操作と使用法は以下の例をご覧ください:

#include <iostream>
#define isNs1 1
//#define isGlobal 2
using namespace std;
void func() 
{
    cout<<"::func"<<endl;
}

namespace ns1 {
    void func()
    {
        cout<<"ns1::func"<<endl; 
    }
}

namespace ns2 {
#ifdef isNs1 
    using ns1::func;    /// ns1中的函数
#elif isGlobal
    using ::func; /// 全局中的函数
#else
    void func() 
    {
        cout<<"other::func"<<endl; 
    }
#endif
}

int main() 
{
    /**
     * 这就是为什么在c++中使用了cmath而不是math.h头文件
     */
    ns2::func(); // 会根据当前环境定义宏的不同来调用不同命名空间下的func()函数
    return 0;
}
完全なコードはこちら:using_global.cpp

アクセス性の変更

class Base{
public:
 std::size_t size() const { return n;  }
protected:
 std::size_t n;
};
class Derived : private Base {
public:
 using Base::size;
protected:
 using Base::n;
};

クラスDerivedはBaseをprivate継承しているため、これにとってメンバ変数nとメンバ関数sizeはprivateです。using文を使うと、それらのアクセス性を変更できます。上の例では、sizeはpublicの権限でアクセスでき、nはprotectedの権限でアクセスできます。 完全なコードはこちら:derived_base.cpp

関数のオーバーロード

継承の過程で、派生クラスはオーバーロードされた関数の0個以上のインスタンスをオーバーライドできます。1つのオーバーロード版を定義してしまうと、他のオーバーロード版はすべて見えなくなってしまいます。

基底クラスのオーバーロード関数のうち、派生クラスで1つを変更し、他のものは見えるままにしたい場合は、すべての版をオーバーロードし直さなければならず、これは非常に面倒です。

#include <iostream>
using namespace std;

class Base{
    public:
        void f(){ cout<<"f()"<<endl;
        }
        void f(int n){
            cout<<"Base::f(int)"<<endl;
        }
};

class Derived : private Base {
    public:
        using Base::f;
        void f(int n){
            cout<<"Derived::f(int)"<<endl;
        }
};

int main()
{
    Base b;
    Derived d;
    d.f();
    d.f(1);
    return 0;
}
上のコードのように、派生クラスの中でusing宣言文によって名前だけを指定し仮引数リストを指定しなければ、基底クラスのメンバ関数1つに対するusing宣言文で、その関数のすべてのオーバーロードインスタンスを派生クラスのスコープに追加できます。このとき派生クラスは、自分に特有の関数だけを定義すればよく、継承した他の関数を再定義する必要はありません。

完全なコードはこちら:using_derived.cpp

typedefの置き換え

Cでは typedef A B のような構文がよく使われ、BをA型として定義します。つまりA型に別名Bを与えるのです。

typedef A B に対応して、using B=A を使えば同じ操作が行えます。

typedef vector<int> V1; 
using V2 = vector<int>;
完全なコードはこちら:using_typedef.cpp

関連トピック

コメント