2013-05-04 16 views
5

メンバーを非公開にしたいと思っています。それにもかかわらず私はそれらを公開する例を見たと思うが、これはプライベートキーワードで得られた事実である。私の質問:それを行う方法、それが可能な場合禁止されるべきではありませんか?これはプライベートクラスを継承することは可能ですが、メンバーを公開することができますか?

class U{ 
public: 
    int a; 
protected: 
    int b; 
private: 
    int c; 
}; 

class V : private U{ 
public: 
    int i; 
    //can make a public again? 
}; 

答えて

5

どのようにそれを行うには?

usingキーワードを使用してください。

禁止しないでください。

不要です。 の返信先はいつでもですが、の返信先は、最初はでした。だから、基本クラスが最初に何かをpublicとして宣言していて、それをプライベートにするというあなたのアイデアや制限だった場合、この制限を破棄し、これをpublicとして残しておくと基底クラスを傷つけることはありません。始まり。ここで "C++プログラミング言語"を参考にしてください。

using宣言は、追加 情報にアクセスするために使用することができません。 がアクセスできるようにするための単純な仕組み の方が便利です。

それは、基本クラスでアクセス可能だった、とあなたは(public,protected,privateを)この制限を削除し、適切な部分に「輸送」することによって、それらをアクセスの彼らの初期レベルをそれらをバック返すことができprotectedまたはprivateキーワードを使用してクラスを派生そうならばあなたの派生クラス定義で。

class U{ 
public: 
    int a; 
protected: 
    int b; 
private: 
    int c; 
}; 

class V : private U{ 
public: 
    using U::b; 
    using U::a; 
}; 

int main(int argc, char** argv) { 

    V v; 
    printf("\nV: %d %d %d",v.a,v.a,v.b); 

    U u; 
    printf("\nU: %d %d %d",u.a,u.a,u.a); 

    return 0; 
} 
+3

本当ではありません。 OPは* private *データメンバーについて質問しています。 –

+0

OPは 'U :: c'について質問しています。これは' U'でプライベートです。 – juanchopanza

+1

@AndyProwlいいえもちろん私はもちろん –

6

ほかに、それはカプセル化に違反するとして、おそらく欠陥があるを必要とする設計がUにプライベートとV(からアクセスできないので、あなたがc公開することはできません - クラスが知っているべきではありません/他のクラスのメンバーについてはprivateを気にしてください)。

しかし、同じことが、そのアクセスレベルusing宣言を通して派生クラスによってオーバーライドできprotectedpublicメンバーの真ではありません。例えば:

class V : private U{ 
public: 
    int i; 

    using U::a; 
// ^^^^^^^^^^^ Gives "a" public accessibility 

    using U::b; 
// ^^^^^^^^^^^ Gives "b" public accessibility 

    // using U::c; // ERROR! c is not accessible from V 

}; 

上記VUからbは、クライアントコードからアクセス可能な外部になるだろう:

int main() 
{ 
    V v; 
    v.a = 42; // OK 
    v.b = 1729; // OK 
} 
+0

申し訳ありませんが、私は、もちろん、cは公共 –

+0

@authorityませんでした意味:ああ、OK、その後。さて、答えはまだ有効です:) –

3

それはUからprivateあるので、あなたは、U::c公開することはできませんので、Vからアクセスすることはできません。 publicまたはprotectedの場合は、using宣言を使用できます。そのため、あなたはU::aU::bパブリックではなくU::cを行うことができます。

class V : private U{ 
public: 
    int i; 
    //can make c public again? 
    using U::c; // ERROR: only if U::c is public or protected in U 
    using U::a; // OK 
    using U::b; // OK 
}; 
+0

ありがとう –

関連する問題