STLのリストについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
alice

STLのリストについて

#1

投稿記事 by alice » 16年前

初投稿です。よろしくお願いします。内容はSTLのリストについてです。
class Super{
public:
    virtual void draw();
};

class Sub1 : public Super{  //Sub2なども存在する
public:
    virtual void draw();
};
というクラスがあるとき
list<Super> tmp;
で確保したリストにSub1,Sub2…などの派生クラスのインスタンスを格納し、
tmp.push_back(Sub1());
tmp.push_back(Sub2());

list<Super>::iterator itr = tmp.begin();
list<Super>::iterator itrEnd = tmp.end();
for( ; itr != itrEnd; itr++){
    itr->draw();
}
このようにdrawを呼び出していますが、親のdrawが呼び出されてしまっています。
派生クラスのdrawを呼び出すことは可能でしょうか?

たかぎ

Re:STLのリストについて

#2

投稿記事 by たかぎ » 16年前

これは絶対行ってはいけないことです。
std::list<Super>の要素はあくまでもSuperクラスですので、これに対してpush_backで派生クラスのオブジェクトを追加しようとするとスライスが発生します。その結果、プログラムは破綻します。

> 派生クラスのdrawを呼び出すことは可能でしょうか?

std::listクラステンプレートの要素をSuperへのポインタか、スマートポインタにしましょう。
扱いが簡単なのは、
std::list<std::tr1::shared_ptr<Super> > tmp;
tmp.push_back(std::tr1::shared_ptr<Super>(new Sub1));
のようにする方法です。
あるいはboost::ptr_list<Super>を使うのもよいでしょう。

alice

Re:STLのリストについて

#3

投稿記事 by alice » 16年前

環境がVS2008SP1なので前者の方法をとり無事解決しました。
早い回答ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る