一般的using關鍵子我們都是用來聲明當前文件的命名空間,比如標準庫的命名空間std-> using namespace std;
但在c++11中,它的用處還有幾個 1:取代typedef ,2:讓父類同名函數在子類中以重載方式使用
以下是《深入理解c++11》的對1:的截圖
以下是自己的實現
//---------------------------------------test2 可以取代typedef了,而且更加靈活
using myIntVec = std::vector<int>;
void testUsing2()
{
myIntVec mvec = { 1, 2, 3, 4, 5 };
mvec.push_back(123);
for (int num : mvec)
printf("--- num:%d\n", num);
std::cout << is_same < std::vector<int>, myIntVec>::value << std::endl; // 1
}
template <typename T>
using MapStr = std::map<T, std::string>;
void testUsing3()
{
MapStr<int> intStrMap;
intStrMap.insert(make_pair(123, "aaa"));
intStrMap.insert(make_pair(456, "bbb"));
MapStr<std::string> strstrMap;
strstrMap.insert(make_pair("ccc", "ddd"));
strstrMap.insert(make_pair("eee", "fff"));
}
第二種用處,直接看代碼註釋吧
//---------------------------------------test1
using namespace std;
class Base
{
public:
void menfcn()
{
cout << "Base function" << endl;
}
void menfcn(int n)
{
cout << "Base function with int" << endl;
}
//private:
// void menfcn(std::string _name) {}//會讓基類using時報不可訪問的錯
};
class Derived : private Base
{
public:
using Base::menfcn;//using聲明只能指定一個名字,不能帶形參表,且基類的該函數不能有私有版本,否則編譯報錯
//using父類方法,主要是用來實現可以在子類實例中調用到父類的重載版本
int menfcn(int num)
{
cout << "Derived function with int : "<< num << endl;
return num;
}
};
/*
“隱藏”是指派生類的函數屏蔽了與其同名的基類函數,規則如下:
1、如果派生類的函數與基類的函數同名,但是參數不同。此時,不論有無virtual關鍵字,基類的函數將被隱藏(注意別與重載混淆)
2、如果派生類的函數與基類的函數同名,並且參數也相同,但是基類函數沒有virtual關鍵字。此時,基類的函數被隱藏(注意別與覆蓋混淆)
使用了using關鍵字,就可以避免1的情況,使得父類同名函數在子類中得以重載,不被隱藏
*/
void testUsing1()
{
Base b;
Derived d;
b.menfcn();
d.menfcn();//私有的也可以訪問啦,如果去掉Derived類中的using聲明,會出現錯誤:error C2660: 'Derived::menfcn' : function does not take 0 arguments
d.menfcn(123);
/*
Base function
Base function
Derived function with int : 123
*/
}