C++中的using關鍵字

using一直都是關鍵詞,但是C++11對其賦予了新的功能。

using在C++11之前主要用於名字空間、類型、函數與對象的引入,實際上是去除作用域的限制。

常用如:

using namespace std; //引用命名空間

using std::iostream; //引用類型

using std::to_string; //引用函數

using std::cout;//引用對象

值的注意的用法是可以通過using來允許子類聲明基類成員名稱

class A
{

public:
	int v;
};

class B: private A
{
public:
	using A::v;
	void fun()
	{
	    cout<<v<<endl;
	}
};

當子類中的成員函數和基類同名時,子類中重定義的成員函數將隱藏基類中的版本,即使函數原型不同也是如此。

如果基類中成員函數有多個重載版本,派生類可以重定義所繼承的 0 個或多個版本,但是通過派生類型只能訪問派生類中重定義的那些版本,所以如果派生類想通過自身類型使用所有的重載版本,則派生類必須要麼重定義所有重載版本要麼一個也不重定義。有時類需要僅僅重定義一個重載集中某些版本的行爲,並且想要繼承其他版本的含義,在這種情況下,爲了重定義需要特化的某個版本而不得不重定義每一個基類版本,可能會令人厭煩。可以在派生類中爲重載成員名稱提供 using 聲明(爲基類成員函數名稱而作的 using 聲明將該函數的所有重載實例加到派生類的作用域),使派生類不用重定義所繼承的每一個基類版本。一個 using 聲明只能指定一個名字,不能指定形參表,使用using聲明將名字加入作用域之後,派生類只需要重定義本類型確實必須定義的那些函數,對其他版本可以使用繼承的定義。

“隱藏”是指派生類的函數屏蔽了與其同名的基類函數,規則如下:

1、如果派生類的函數與基類的函數同名,但是參數不同。此時,不論有無virtual關鍵字,基類的函數將被隱藏(注意別與重載混淆)

2、如果派生類的函數與基類的函數同名,並且參數也相同,但是基類函數沒有virtual關鍵字。此時,基類的函數被隱藏(注意別與覆蓋混淆)

 

而從C++11開始,可以使用using代替typedef,給類型命名:


typedef int ll;

using ll = int;

這兩行的效果是一樣的,這種簡單情況看起來using新增加的功能沒有什麼特殊,但是 using現在可以支持對模板的重命名:

 


 

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