2013-11-25 32 views
1

我真的不明白我什麼時候需要using關鍵字。當你想使用基類中的函數或對象時,你是否總是需要它?即使我沒有重載函數,我也必須使用它。`使用`關鍵字從基類的默認行爲

+3

您需要了解命名空間。 – SLaks

+1

@SLaks OP的問題[與命名空間無關](http://en.cppreference.com/w/cpp/language/using_declaration) – Mgetz

回答

2

只有兩種情況需要在課堂上使用using。首先是當你在類中定義一個與基類中的函數名相同的函數時,並且你想要考慮兩者都使用重載。另一種是當你想使用基類構造函數作爲派生構造函數時。

+0

如果基類是一個模板,這個規則有什麼區別嗎? – Plamen

+0

@Plamen,我不明白爲什麼有一個基類模板會有所作爲,但我不能明確說出它。 –

+0

感謝您的回答!我認爲如果使用模板,它確實會有所作爲。我一直在運行一些測試,似乎編譯器無法確定在使用模板參數時該怎麼做。我有一個函數'stupid'在基地,並得到'錯誤:沒有參數'愚蠢'取決於模板參數,所以聲明'愚蠢'必須是可用的[-fpermissive]'如果我用它在派生的(它不重新聲明,只是使用)。 – Plamen

2

您只需要一個using -directive的基類成員,當您在派生類中重載相應的名稱時,您希望使基類重載可見。當你不使用detived類中的名字時,你根本不需要一個using-directive。

背景是,如果對基類的更改會劫持函數超載,那麼這被認爲是令人驚訝的。因此,基類的重載默認是隱藏的。如果你想讓他們使用,你正在做一個explucit變化。

讓我們假設該規則不適用,並考慮派生類定義成員f(double),它被稱爲object.f(0)。如果基類更改爲提供f(int)並且重載可見,則新函數將更好地匹配。也就是說,在行爲默默地被改變之前不可見。這可能是一個壞主意。

0

如果處理命名空間,則必須使用它。例如:

using namespace std; 
using std::cout; 
using std::endl; 
// without that you have to type it in following way 
std::cout << std::endl; 
// which is not the best way if you use it very often, 
// but good if you want to use some names in your code 

這允許您使用一些具有名稱空間的庫。它已被創建用於隱藏(隱藏)變量,類和方法,否則它會佔用更多的命名空間,並且禁止在項目中使用某些名稱。

+0

OP的問題有[與命名空間無關](http://en.cppreference.com/w/cpp/language/using_declaration) – Mgetz