2017-03-03 19 views
1

我需要一些關於類的using關鍵詞的快速說明,因爲我不確定我是否正確理解它。C++ - 「使用」關鍵字澄清

比方說,我有下面的例子:

class B { 
public: 
    int var; 
    int f(void); 

}; 

class C : public B {protected: using B::var; }; 

這是否意味着,而不是繼承的變量varpublic從B類,C類,而不是繼承這個變量作爲protected和留下的唯一公共變量是int f(void);

此外,類C可以通過在其內部具有private: using B::var;繼承該變量作爲私有?

有沒有寫點public: using B::var;,因爲變量var已經在類B中公開了?

謝謝!

+0

'C類'不是從'B'公開繼承的,對嗎? – qxz

+0

你可能是對的。我應該在那裏寫出關鍵字public。我會編輯它。無論如何,如果關鍵字丟失,什麼lvl是從類B繼承的類C呢? – Daeto

+0

好,我認爲是這樣,但我不確定。 – Daeto

回答

4

這是否意味着,而是繼承了可變varpublic從B類,C類,而不是繼承這個變量作爲protected離開將是int f(void);唯一的公共變量?

是的,C::var現在是受保護的會員。使用B::var;其體內:

class B 
{ 
public: 

    B() : var(0) { } 

    int var; 

protected: 

private: 

}; 


class C : public B 
{ 
public: 

    C() : B() { } 

protected: 

    using B::var; 

private: 

}; 

void main() 
{ 
    B b; 
    b.var = 3; // <-- OK 

    C c; 
    c.var = 3; // <-- error C2248 
} 

而且,可以在C類具有私有繼承變量作爲私有:

您可以通過嘗試編譯下面的測試呢?

同樣,你可以繼承它作爲private。雖然可以通過B訪問該成員來避開。

class B 
{ 
public: 

    B() : var(0) { } 

    int var; 

protected: 

private: 

}; 


class C : public B 
{ 
public: 

    C() : B() { } 

protected: 

private: 

    using B::var; 

}; 

class D : public C 
{ 
public: 

    D() : C() 
    { 
     B::var = 3;  // <-- OK 
     C::var = 3;  // <-- error C2248 
    }; 

protected: 

private: 

}; 

,並有寫public: using B::var的任何一點;因爲變量var已經在類B中公開了?

不,沒有意義。這是多餘的。

有關更多信息,請參閱Using-declaration: In class definition

+0

非常感謝您的評論!您能否確認C類:B {protected:using B :: var; };由於缺少關鍵字而從B繼承爲公有或私有? – Daeto

+2

@Daeto如果不指定繼承的類型,那麼類默認繼承爲'private'。在你的例子中'B :: var'被定義爲'public',但由於繼承是'private'(默認),'C :: var'是私有的。但是由於你的'using','C :: var'被'保護'。請參見[默認類繼承訪問](http://stackoverflow.com/a/3811480/735425)和[私有,公共和受保護繼承之間的區別](http://stackoverflow.com/a/1372858/735425)。 – ssell