最終更新:2026-10-12
C++ using 宣言とエイリアス¶
著者について:¶
個人公式アカウント(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;
}
アクセス性の変更¶
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_derived.cpp
typedefの置き換え¶
Cでは typedef A B のような構文がよく使われ、BをA型として定義します。つまりA型に別名Bを与えるのです。
typedef A B に対応して、using B=A を使えば同じ操作が行えます。
完全なコードはこちら:using_typedef.cpp関連トピック¶
- C++ 純粋仮想関数と抽象クラス | C++那些事
- C++ assert アサーション | C++那些事
- C++ ビットフィールド | C++那些事
- C 言語による C++ 多態の実現 | C++那些事
- C++ const 定数と修飾 | C++那些事
- C++ const ファミリー | C++那些事
- C++ 間接参照演算子 * | C++那些事
- C++ 初期化と代入 | C++那些事
- C++ 複数戻り値の書き方 | C++那些事
- C++ mutable キーワード | C++那些事