c++11中的using關鍵字



一般的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
	*/
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章