C++中using
關(guān)鍵字一般有三種用處:
1. 用于命名空間
用于引入定義于別處的名稱到此 using 聲明出現(xiàn)的聲明性區(qū)域阁簸,典型如:
using namespace std;
具體的用法可參見:命名空間
2. 用于類成員
using
聲明引入基類成員到派生類定義恩沽,例如暴露基類的受保護(hù)成員為派生類的公開成員, 若名稱是基類的重載成員函數(shù)之名跃须,則引入帶該名稱的所有基類成員函數(shù)茵休。若派生類已有同名获讳、參數(shù)列表及限定的成員艰毒,則派生類成員隱藏或覆寫引入自基類的成員(不與之沖突)
#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 為受保護(hù)
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; // 錯(cuò)誤掉盅, B::m 受保護(hù)
d.m = 1; // 受保護(hù)的 B::m 可作為公開的 D::m 訪問
b.f(1); // 調(diào)用派生類 f()
d.f(1); // 調(diào)用派生類 f()
d.g(1); // 調(diào)用派生類 g(int)
d.g('a'); // 調(diào)用基類 g(char)
b.h(1); // 調(diào)用基類 h()
d.h(1); // 調(diào)用派生類 h()
}
詳細(xì)可參考鏈接
3.用于類型別名和別名模版
3.1 用于類型別名
在此種情況下與typedef
作用一致朝扼,其不引入新類型赃阀,且不能更改既存類型名的含義
3.2 用于別名模板
別名模板是特化時(shí)等價(jià)于以別名模板實(shí)參替換type-id
中形參的結(jié)果:
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
力不能及的