ページ 11

STLのリストについて

Posted: 2009年5月06日(水) 23:23
by alice
初投稿です。よろしくお願いします。内容は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のリストについて

Posted: 2009年5月06日(水) 23:32
by たかぎ
これは絶対行ってはいけないことです。
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>を使うのもよいでしょう。

Re:STLのリストについて

Posted: 2009年5月07日(木) 00:33
by alice
環境がVS2008SP1なので前者の方法をとり無事解決しました。
早い回答ありがとうございました。