2017-03-03 4 views
1

私は正しく理解できないので、クラスについてはusingキーワードについて簡単に説明しておきます。C++ - キーワードの説明を使用しています

のは、私は次の例があるとしましょう:

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

}; 

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

その代わりに、クラスBからpublicとして変数varを継承のため、クラスCの代わりにprotectedとしてこの変数を継承し、残された唯一のパブリック変数をすることを意味していますint f(void);ですか?

また、クラスCはprivate: using B::var;をその本体の内部に持つことで、変数をプライベートとして継承できますか?

変数varは既にクラスBの内部で公開されているので、public: using B::var;と書くのは何ですか?

ありがとうございます!その代わりに、クラスBからpublicとして変数varを継承のため、クラスCの代わりにprotectedとしてこの変数を継承し、残された唯一のパブリック変数がint f(void);なること

+0

'class C'は最初に' B'から公に継承されません、そうですか? – qxz

+0

あなたはおそらく正しいでしょう。私はそこにキーワードpublicを書いていたはずです。私はそれを編集します。とにかく、キーワードが見つからない場合は、クラスCがクラスBから継承しているlvlに? – Daeto

+0

よかった、私はそう思ったが、私は確信していなかった。 – Daeto

答えて

4

を意味するのでしょうか?

はい、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の内部でpublicなので?

いいえ、何もありません。冗長です。

詳細については、Using-declaration: In class definitionを参照してください。

+0

このコメントをいただきありがとうございます!クラスC:B {protected:B :: varを使用しているかどうかを確認してください。 };キーワードが見つからないので、Bから公的または私的なものとして継承しますか? – Daeto

+2

@Daeto継承のタイプを指定しないと、クラスはデフォルトで 'private'に継承されます。あなたの例では、 'B :: var'は' public'と定義されていますが、継承は 'private'(デフォルト)であるため、' C :: var'はprivateです。しかし、あなたの '使用する 'ため、' C :: var'は 'protected'になります。 [Default class inheritance access](http://stackoverflow.com/a/3811480/735425)と[private、public、protected継承の違い](http://stackoverflow.com/a/1372858/735425)を参照してください。 – ssell

関連する問題