プロが教えるわが家の防犯対策術!

アップキャストは、なぜ使用するのでしょうか。

<ソース;アップキャストのソース>
//派生クラスのオブジェクトw宣言する。
MyClass3 mc3("パラメータ1","パラメータ2","パラメータ3");

//基本クラスのオブジェクトを宣言する。
MyClass2 mc2;

//派生クラスのオブジェクトを基本クラスに代入する。
mc2 = mc3;


上記ソースの流れをすることのメリットがわからないのです。
派生クラスを、基本クラスに代入することでどのようなメリットが生まれるのでしょうか…。
(ダウンキャストも今いちするメリットが見えないのですが・・・。)

ご教授お願いします。

A 回答 (3件)

class 書けるもの {


public: virtual void 書く() =0;
};

class 黒板 : public 書けるもの {
public: virtual void 書く() { .... }
};

class USBメモリ : public 書けるもの {
public: virtual void 書く() { .... }
};
...

書けるもの* いろいろ[N]; // この中に黒板、USBメモリ... ありとあらゆる書けるもの
for ( int i = 0; i < N; ++i ) {
書けるもの* writable = いろいろ[i];
writeble->書く();
}

なんてな。
書けるものでありさえすれば、それが何かを知らぬまま 書く() ことができます。
    • good
    • 0
この回答へのお礼

>書けるものでありさえすれば、それが何かを知らぬまま 書く() ことができます。

継承して仮想関数で書くまでは、わかったのですが

「いろいろ」の部分で分からなくなってしまいました。
少し考えてみることにします。

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

お礼日時:2012/08/26 23:11

> 書かれているソースはアップキャストでなく、コピーコンストラクタのような。



...ホントだ。 てかコピー・オペレータですが(コピー・コンストラクタではなく)。
# コピー・コンストラクタなら MyClass2 mc2 = mc3;
    • good
    • 1

書かれているソースはアップキャストでなく、コピーコンストラクタのような。

    • good
    • 0
この回答へのお礼

確かに見直すとコピーコンストラクタを書いてる気がします。

あれから考えてみて、アップキャストするとレイトバインディングとかできるかなと思ってきました。

もう少し考えてみることにします。

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

お礼日時:2012/08/26 23:13

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aと関連する良く見られている質問

Qスーパークラスのインスタンスをサブクラスにアップキャスト

↑したい場合はどうしたらいいでしょうか。

データ構造体(beans)なのでスーパークラスのgetterとsetterを
利用してサブクラスに再構築する方法が考えられますが
どうも腑に落ちないので質問してみました。

サブクラス側で継承をやめて集約にするにしても
getterとsetterをまた書くの?って感じでわずらわしいです。
(jsp:getPropertyを利用するかもしれませんしね)
さらにスーパークラスのメソッド全てをインタフェース化してサブクラスで実装とかしてたら具合が悪くなってきます。

この長年の疑問に終止符を打ってくれる方はいませんか?

Aベストアンサー

これ以上に的確な回答が存在するかもしれませんし、そもそも意図する回答ではないかもしれませんが。。。汗

スーパークラスの記述変更は可能なのですよね?
でしたら、子クラス(継承クラス)を通して、「親クラスで定義されているフィールド」を引数で渡される親クラスと同型(インスタンス自体は別の)のフィールド値に変更すれば何とかなりそうです。
どういった形で実装するかは自由なのですが、ソースコードを拝見した限りコンストラクタで操作をしたいようなので、今回はコンストラクタで値の変更をしてみます。。

import java.lang.reflect. * ;

class Box {
  private String name;
  public Box() {}
  public Box(Box box) {
    try {
      Class c=box.getClass();
      Field[] f=c.getDeclaredFields();
      for(int i=0; i<f.length; i++){
        f[i].set(this,f[i].get(box));
      }
    }
    catch(IllegalAccessException e){}
  }
  public String getName() {
   return name;
  }
  public void setName(String name) {
   this.name = name;
  }
}

他のクラス(ColorBox,Main)は提示された物そのままで動くと思います。

もし見当はズレな回答でしたらゴメンナサイ。
「こんなことせんでも・・・」という方が居られましたら補足・訂正・助言を下さい。私の勉強にもなりますので。

これ以上に的確な回答が存在するかもしれませんし、そもそも意図する回答ではないかもしれませんが。。。汗

スーパークラスの記述変更は可能なのですよね?
でしたら、子クラス(継承クラス)を通して、「親クラスで定義されているフィールド」を引数で渡される親クラスと同型(インスタンス自体は別の)のフィールド値に変更すれば何とかなりそうです。
どういった形で実装するかは自由なのですが、ソースコードを拝見した限りコンストラクタで操作をしたいようなので、今回はコンストラクタで値の変更をし...続きを読む

Q子クラスのオブジェクトに親クラスのオブジェクトを代入

開発環境はMicrofoft visual stdio 2005 で開発言語はC#を使い、Windousアプリケーションでプログラミングしているのですが
子クラスのオブジェクトに、親クラスのオブジェクトを代入する方法が分からなくて困っています><。
ソースコードで説明すると
class Car
{
}

class Bike:Car
{
}

Car oya = new Car();
Bike kodomo = new Car();

kodomo = oya;//これはエラーになる

というかんじです。
これが代入できるような方法はないでしょうか?
かなり抽象的な質問ですが、よろしければ御回答をお願いします。

Aベストアンサー

kodomo = oya
これはあくまで、ポインタ的なものがコピーされるだけです。(インスタンスのクローン(複製)ができるわけではない)
質問を見る限りその辺りが理解できていないと思います。
class Car
{
 public int a;
}
Car oya = new Car();
oya.a = 10;
Car kodomo = new Car();
kodomo = oya;
kodomo.a = 100;

とすると
oya.aも100になります。(kodomoとoyaが同じインスタンスだから)
※ちなみにclassではなくstructにすれば、oyaとkodomoは別物になります。


>もしかして、親クラスはオブジェクトをあまり作らずに、できるだけ子クラスで作ったほうがいいんでしょうか?
それをするなら、そもそもCarとBikeの定義をわける必要が無かったということになります。

一つの方法として
以下のようにコンストラクタに親クラスを渡してメンバをコピーする事もできるでしょう。
class Car
{
 public int a;
}
class Bike : Car
{
 public Bike(Car car)
 {
   a = car.a;
 }
}
Car oya = new Car();
Bike kodomo = new Bike(oya);

kodomo = oya
これはあくまで、ポインタ的なものがコピーされるだけです。(インスタンスのクローン(複製)ができるわけではない)
質問を見る限りその辺りが理解できていないと思います。
class Car
{
 public int a;
}
Car oya = new Car();
oya.a = 10;
Car kodomo = new Car();
kodomo = oya;
kodomo.a = 100;

とすると
oya.aも100になります。(kodomoとoyaが同じインスタンスだから)
※ちなみにclassではなくstructにすれば、oyaとkodomoは別物になります。


>もしかして、親クラスはオブジ...続きを読む

Q「いずれか」と「いづれか」どっちが正しい!?

教えて下さいっ!
”どちらか”と言う意味の「いずれか」のかな表記として
「いずれか」と「いづれか」のどちらが正しいのでしょう???

私は「いずれか」だと思うんですが、辞書に「いずれか・いづ--。」と書いてあり、???になってしまいました。
どちらでもいいってことでしょうか?

Aベストアンサー

「いずれか」が正しいです.
「いづれ」は「いずれ」の歴史的かな遣いですので,昔は「いづれ」が使われていましたが,現代では「いずれ」で統一することになっていますので,「いずれ」が正しいです.

Q「該当」と「当該」の違い

辞書には、「該当」・・・その条件にあてはまること。「当該」・・・その事に関係がある。
・・・とあります。
“あてはまる”と“関係がある”、微妙に違うようで似ているようで、お恥かしいのですが私にははっきり区別ができないのです。
該当とすべきところを当該としたら、意味はまったく違ってくるでしょうか?
わかりやすく両者の違いや使い方を解説していただけませんか?宜しくお願いします。

Aベストアンサー

よく似た意味の言葉(名詞)ですが、

○該当…「する」をつけて「当てはまる」という意味の動詞として用いることができる

○当該…主に他の名詞の前につけて「今議論の対象になっている、まさにそのもの」という意味で内容を限定する形容詞的な形で用いる

といった違いがあります。逆の用法はありません。

・この条件に当該する人は申し出てください。

・○○事件につき、該当被告人を有罪に処す。

いずれもおかしな使い方で、反対でないとアウトです。

ご参考になれば幸いです。

Q【C#】 あるイベントから別イベントを呼び出す。

タイトルの通り、あるイベント内から別イベントの処理を呼び出したいと
考えています。ですが、方法がわかりません。

【質問投稿に至った経緯】
現状は、検索から一覧を表示し1つを選択、選択した内容の更新を行なうプログラムを作成しています。選択した内容を更新するところまではできました。ただ、更新内容を確認できるよう一覧画面に前回検索した内容を一覧表示させたいと考えています。この時、検索イベントを呼び出し、一覧を再表示させようと思っています。

Aベストアンサー

「検索イベント」とは、[検索]ボタンをクリックした時の
イベント処理の事でしょうか?
それならば、一覧表示処理を別ルーチンに分けて、[検索]
ボタンClickイベントと同じルーチンをCallする様にすれば
良いと思いますが?

Qクラスの継承でメンバ変数が・・

初めてクラスの継承をしている者です。

親クラスA のメンバ変数らを
親クラスAからの処理で呼び出した
子クラスB で変更したいのですが、

子クラスB内ではちゃんと処理で数値が変化するのですが、
親クラスAに戻ると数値が全て初期値に戻ってしまいます。

継承方法は単に public 親クラスA と記述しているだけで、
親クラスAと子クラスBは別々のファイルに1クラスずつで記述しています。
コンパイルは警告もエラーも出ず動きます。

子クラスから親クラスのメンバ変数を変更するにはどうすれば良いのでしょうか?

Aベストアンサー

単純な回答としては、親クラスと子クラスでは同じ変数名でも
変数が格納されている場所が違うということです。

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);
とするとうまくいくと思います。わかりにくい記述で済みません。

単純な回答としては、親クラスと子クラスでは同じ変数名でも
変数が格納されている場所が違うということです。

class 親クラス {
private(protected?) int a;
public void setA(int);
public int getA();
....
}
class 子クラス pubic 親クラス {
....
}

とした場合(細かい文法の誤りはご容赦を)、
コード内で

class 親クラス A;

A.メンバ関数() {
class 子クラス B(); //コンストラクタ
};

というような場合、親クラスAのインスタンスと子クラスBの
インスタンスが別...続きを読む

Q複数の変数を宣言する時、同時に初期化?できないでしょうか?

複数の変数を宣言する時、同時に初期化?できないでしょうか?

例えば、
int a,b,c;
とした時に、それぞれに1を入れる、みたいに。

Aベストアンサー

int a = 1, b = 1, c = 1;

と記述すれば初期化できると思いますよ。

Q「ラッパークラス」の存在意義が分かりません。

「ラッパークラス」の存在意義が分かりません。

ラッパークラスの使い方などについての解説はよく目にしますが、
その意義となると、明確な説明を見たことがありません。
(本質問では、使い方を質問しているわけではありません。)

どういう意味で、便利なのか、
つまり、その存在価値について、お聞きしたいのです。

これがないと乗り越えられない壁があるのでしょうか。
その壁を乗り越えるための道具として、用意されたものであるなら、
その壁というものを教えて頂きたいです。

どなたか宜しくお願い致します。

Aベストアンサー

個人的に納得している状況を話しますね。
プリミティブなデータ(例えばint)はそれ自体に実体が
あるから、「インスタンス化」なんてしませんよね。
ということは「null」には絶対にならないわけです。
ところで、データベースからレコードを読み込み、整数型の
フィールドのデータを受け取ることを想定します。
そのフィールドがnullだった場合、受け取る変数がint型で
あったら、「nullであること」を表現できません。nullと
0は違いますからね。でも、Integer型の変数ならnullにする
ことができます。それにtoStringで編集したりできるのも
ウレシイところです。
あと、リフレクションをやると分かりますけど、実行させる
メソッドに渡す変数は本体の定義がプリミティブ型でも、
オブジェクト型の配列にする必要があるので、ラッパークラスに
限られます。

QC#の動的キャスト

いつもお世話になっています。
C#の動的キャストに関する質問です。

C#のメソッドにobjectの引数を渡して動的にキャストする場合
void Hoge(object obj)
{
Type t = Type.GetType(obj);
objの型 obj2 = (objの型)Convert.ChangeType(obj, t); //(1)
.................................
}
のようにされています。

しかし多様性をもつobjcetを引数にする多くの場合は「objの型」は不定です。
逆に言えば「objの型」がわかっている場合はわざわざobjectを引数にする必要はないわけです。

そこで質問ですが、何とかType t から「objの型」を取得して(1)記法による動的キャストを行う方法はないでしょうか?

GetMethod, GetPropertyでメソッド,プロパティを取得し、Invoke, GetValue, SetValueすることは可能ですが、できればドット記法(.)が使える (1) のような動的キャストを行いたいと考えています。

よろしくお願いします。

いつもお世話になっています。
C#の動的キャストに関する質問です。

C#のメソッドにobjectの引数を渡して動的にキャストする場合
void Hoge(object obj)
{
Type t = Type.GetType(obj);
objの型 obj2 = (objの型)Convert.ChangeType(obj, t); //(1)
.................................
}
のようにされています。

しかし多様性をもつobjcetを引数にする多くの場合は「objの型」は不定です。
逆に言えば「objの型」がわかっている場合はわざわざobjectを引数にする必要はないわけです。

そこで質問ですが、何と...続きを読む

Aベストアンサー

そのままではT型のメソッドやプロパティを呼ぶことはできません。
Bar()やFugaはHogeに渡す型すべてに存在するのでしょうか?
もしするのでしたら最大公約数的なインターフェイスを作って、
それぞれの型に実装してあげると使えるようになります。
interface HogeBase
{
 void Bar();
 object Fuga{ get; set; }
}
void Hoge<T>(T obj) where T : HogeBase
{
 obj.Bar();
 member = obj.Fuga;
}

Bar()やFugaはHogeに渡す型すべてに存在するのでないのなら、
少々手間が増えますがそれでも↑の応用でいけます。

(2)は型情報が要らないのなら捨ててしまっていいと思います。


人気Q&Aランキング