class Человек
{
protected:
int кошелёк;
};
class Мужчина : public Человек
{
int fч( Человек& ч );
int fм( Мужчина& м );
};
int Мужчина::fч( Человек& ч ) // 1
{
кошелёк = 100; // Всё в порядке. моё.
int s = ч.кошелёк; // protected member access errorвполне справедливоreturn s;
}
int Мужчина::fм( Мужчина& м ) // 2
{
кошелёк = 100; // Всё в порядке, кошелёк мой собственный
int s = м.кошелёк; //это компилируется. и это НЕПРАВИЛЬНО!кошелёк ЧУЖОЙ !!
// С фига ли я должен иметь доступ к твоему кошельку, только на основании того что мы с тобой оба "Мужчины" ??
return s;
}
class Человек
{
protected:
int кошелёк;
public:
void Человек() { a=3; }
void gч( Человек& ч )
{
ч.кошелёк--; // Даже это не должно компилироваться. не следует лазить в чужой кошелёк!
кошелёк++; // в свой можно
}
};
class Человек
{
private:
int кошелёк;
public:
void Человек() { кошелёк=3; }
void gч( Человек& ч )
{
ч.кошелёк--; // сейчас работает. а не должно ;)
}
};
プロフィールでservicedeskを検索する。
ここに矛盾はなく、そうでなければBはCから派生しないのに、以下のようにC.tにアクセス することになります。
あなたの例では、BはC.tにアクセスできるはずで、それを禁止する理由は見当たりません。
クラスとインスタンスを混同していますね。 同じクラスBの別のインスタンスがtにアクセスすることもできないはずですが。
保護されたフィールドは、own(同じBのインスタンス、つまりthis)だけがアクセスでき、他のインスタンス(同じBクラスであっても)は閉じなければならない...ここで、わかりやすいように名前を変えてみよう。
つまり、私にとっては、最初の関数だけでなく、両方の関数がコンパイルできないはずです。 C++では、2番目の関数がコンパイルされて動くとしたら、それはC++のパンクであって、美徳ではありません。
要するに
財布との比較は誤りです。
プロテクテッドメンバーへのアクセスが必要な例を挙げれば、私やあなたの好みの問題ではありません。
プログラマが何かを禁じたいのであれば、自分でやればいいし、コンパイラが禁じなければならない。
プログラムに支障をきたす可能性がある場合。
上の例では、クラスBはクラスAについて知っているので、そこで何かを台無しにすることはないでしょう。
そして、それを認めないのであれば、Privateセクションに入れるか、あるクラスから継承しないか、その他千差万別の方法を考えてください。
C++で2番目の関数がコンパイルされて動くとしたら、それはC++の欠陥であって、長所ではありません。
そうすれば、そのウォレットもアクセスできなくなる
もう一度言いますが、クラス(型)とインスタンス(変数)は慎重に区別してください。 自らの(この)プロクタフィールドは自由にアクセスでき、継承によっても(プライベートとは異なり)、他の(同じクラスの他の変数)にはアクセスできないようにしなければなりません。(アクセスできないはずの)
.....
上の例では、クラスBはクラスAについて知っているので、そこで何かを台無しにすることはないでしょう。
あなたが財布を持っていることを知って いるからといって、それにアクセスする理由にはなりません。 あなたのものには、get() と set() だけを通してください - あなたがそれを許可するならば (public: int get(); int set();)).
あなたが財布を持っていることを知って いるからといって、それにアクセスする理由はありません。 あなたの財布に - どうぞ。 あなたの財布に - get() と set() を通してのみ - あなたが許可した場合 (public: int get(); int set();) 。
財布はあくまで特殊なケースです。そして、誰もそれを私的な部分に置くことを止めない。
また、別のケースでは、他人のオブジェクトの親クラス変数にアクセス する必要がある場合があります。
そして、これを許可するかどうかは、プログラマーの判断に委ねられる。そして、コンパイラはそのプログラムが正しく動作することを保証しなければならない。
私は矛盾の例を挙げた......オブジェクトは同じです。
矛盾はありません。もし、「外部インタフェース」を通じて自分自身を参照する場合は、自分自身の顔を殴られることを覚悟してください ;)
.................................コンパイル時にはオブジェクトに関する情報を持って いないため。
1.財布はあくまで特殊なケースです。そして、誰もそれを私的な部分に置くことを止めない。
2.また、別のケースでは、他人のオブジェクトの親クラス変数にアクセス する必要があるかもしれません。
3 そして、これを許可するかどうかは、プログラマーの判断に委ねられる。
4.そして、プログラムが正しく動くかどうかは、コンパイラに任されている。
1.の場合、私服に入れたところで何も変わりません。
継承される、それは明らかです。
2.必要なものはほとんどないでしょう。の根拠は、自分のコピーにアクセスしたときのみ有効です。
3.だから、彼に決めさせよう。;)
4.これは全体の問題で、 具体的に 何をもって「正しい仕事」とするのか、ということです。