- ベストアンサー
クラスの継承でメンバ変数が・・
初めてクラスの継承をしている者です。 親クラスA のメンバ変数らを 親クラスAからの処理で呼び出した 子クラスB で変更したいのですが、 子クラスB内ではちゃんと処理で数値が変化するのですが、 親クラスAに戻ると数値が全て初期値に戻ってしまいます。 継承方法は単に public 親クラスA と記述しているだけで、 親クラスAと子クラスBは別々のファイルに1クラスずつで記述しています。 コンパイルは警告もエラーも出ず動きます。 子クラスから親クラスのメンバ変数を変更するにはどうすれば良いのでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
単純な回答としては、親クラスと子クラスでは同じ変数名でも 変数が格納されている場所が違うということです。 class 親クラス { private(protected?) int a; public void setA(int); public int getA(); .... } class 子クラス pubic 親クラス { .... } とした場合(細かい文法の誤りはご容赦を)、 コード内で class 親クラス A; A.メンバ関数() { class 子クラス B(); //コンストラクタ }; というような場合、親クラスAのインスタンスと子クラスBの インスタンスが別々に生成されます。子クラスから見たメンバaは、 親クラスのそれとは異なるのです。 解決策のひとつとして、子クラスの定義に以下を追加することですか。 子クラス(親クラス*); //コンストラクタ private(protected) 親クラス* ap; 子クラスに生成した親クラスへのポインタを持たせる方法です。 親クラスAから 子クラス B(*A); //とし、 B.ap->setA(num); とするとうまくいくと思います。わかりにくい記述で済みません。
その他の回答 (1)
- zwi
- ベストアンサー率56% (730/1282)
>子クラスから親クラスのメンバ変数を変更するにはどうすれば良いのでしょうか? 結論から言うと今の使い方では出来ません。 たぶんクラスの継承をちゃんと理解されてないんだと思いますが、インスタンスが別の存在である親クラスAと子クラスBの変数は別のメモリ空間に属していますので参照も変更も出来ませんが、子クラスのインスタンス上で親クラスのメンバ関数は子クラスの変更した値を参照することは出来ます。 そもそも子クラスは親のクラスの機能を全て内包しています。なので、親のクラスを呼び出す理由も意味もありませんし、親クラス内から子クラスのインスタンスを作って呼び出すなどエラーは出ないでしょうがオブジェクト志向の流儀に反しています。頭の中で関数とクラスがごっちゃになっているのでは? 実際に何がしたいかによって答えが変わりますが、少なくとも親クラスから子クラスを呼び出すのは止めた方がよいです。
お礼
初めてで、継承すればインタンスは同じと思ってしまったのですが違ったのですね。 うまく理解できませんでしたが、とてもよろしくないやり方をやっているのですね。 別の問題に気を取られて軽率に使ってみたのが間違いだったようです。 もっと勉強しなおしてきます。 ご回答ありがとうございました。
お礼
継承すればインスタンスは同じになるのかと思ったのですが 甘かったようで、すみませんでした。 丁寧に説明して下さって有難うございます。 仰って下さった事をまだ理解できないという事は、 相当基礎がなってないようなので 早く理解できるよう勉強し直してきます。 有難う御座いました。