2011-01-25 10 views
0

ABという2つのクラスがある場合は、Bとなります。Aです。つまり、Aが基本クラスであり、Bが派生クラスです。ここにプライベートメンバーの価値はありますか?

ここで、クラスAにはprivateのメンバーがあるとします。クラスBが継承されたクラスA以降、プライベートデータメンバーはクラスBの一部となりました。

私たちが知っているように、プライベートメンバーは派生クラスであってもアクセスされないと言われていますが、派生クラスに入っています。この場合のプライバシーの価値は何ですか?

ありがとうございました。

+1

はい英語では、問題がコードよりもはるかに(そして簡潔に)説明されています。 –

+0

基本クラスのプライベートメンバーにアクセスできます。コンパイラーはそれを防止しないようにあなたを保護します。 B b; ((A *)&B) - > any_private_member = 0; – 9dan

+0

@ 9dan:実際には、どちらもうまくいかないでしょう。 –

答えて

3

Bというメンバ関数では使用できませんが、Aというメンバ関数には便利です。Bが頼りになります。それは単にカプセル化の別のレベルです(Bは、Aの機能がどのように実装されているか気にする必要はありません)。

+0

なぜdownvote? –

2

まあ、クラスAのプライベートなので、私はクラスAのインスタンスが何かのためにそれらを使用すると仮定します。そうでない場合は、削除することができます。

0

プライベートメンバーです。

どこにアクセスしていないことがわかっていますか?

+0

が真である場合、派生クラスは(それをAオブジェクトにキャストするようなハッキングなしでは)親クラスのプライベートメンバーにアクセスできません – Lacrymology

2

"プライベート"の意図は、クラスBを書く開発者に、このメンバーにアクセスすべきではないことを伝えることです。

クラスAの開発者は、クラスBの開発者が気にする必要のない方法でメンバを使用します。

1

BオブジェクトのAメンバーは、そのオブジェクトで表現しているものを表現するためにオブジェクトに必要なものになります。クラスのメソッドはおそらくそれらを使用しており、おそらくAクラスのメソッドを呼び出すでしょう。本当にAの公開(または保護された)インターフェースだけを気にして、それを利用するべきです。

例:Aが書き込みおよび読み取りメソッドを持つTCP/IPプロトコルソケット実装である場合、BはAの上にSSL実装されている可能性があります。暗号化を行うように(基本的に) A :: readとA :: writeを使用して実際の書き込みと読み取りをソケットから行います。ソケット(またはTCPプロトコルの詳細)がこのデザインに含まれているかどうかを知る必要はないので、Aはそれを抽象化し、アクセスすることはできません。

0

ので、使用の最も簡単な種類とシナリオを想像し、それを信じるかどうか、あなたがAの実装の詳細にカップルBにはしたくない。今

struct A 
{ 
protected: 
    int x; 
}; 

struct B 
{ 
    void f() { ... access x and use as input ... } 
}; 

を、変更することを前提とすることができますあなたのプロダクトに必要なものが必要です。そして、Aはx変数を持っていませんが、代わりに他の方法で表現することを意図した値xを取り込みます。 Bはメンバーに直接アクセスするので、作成したBを変更する必要があります。問題が発生するほど多くの部屋を変更する必要があります。

代わりにxをプライベートメンバーにして、保護されたゲッターを提供すれば、この問題は起こりません。

これもやはり最も簡単な例です。一般的には、xのような値はAの振る舞いの実装に使用され、Bはその振る舞いがどのように実装されているのか、また振る舞いに気を付けるべきではない。

関連する問題