ページ 11

STLのlistでの継承したクラスの関数が実行されない

Posted: 2010年10月24日(日) 15:24
by べす
タイトルの通りです
長いですがソースを載せます

(インクルード省略)
class object
{
public:
int num;
object(int _num)
{
num=_num;
}
virtual void show(){};
};

class A : public object
{
public:
A (int _num) : object(_num)
{
cout << "Created A" << endl;
}
void show()
{
cout << "A " << num << endl;
}
};
class B : public object
{
public:
B (int _num) : object(_num)
{
cout << "Created B" << endl;
}
void show()
{
cout << "B " << num << endl;
}
};
int main()
{
list <object> lst;
list <object> ::iterator it;

lst.push_back(A(1));
lst.push_back(A(2));
lst.push_back(B(3));

for(it = lst.begin();it != lst.end() ; it++)
{
it->show();
cout << it->num << endl;
}

cin.get();
return 0;
}

なぜか、
it->num;
はちゃんと継承したクラスのnumが参照されるのに
it->show()
だと、親クラスの関数が実行されます
継承したクラスの関数を実行するにはどうすればいいんでしょうか?
よろしくお願いします

Re:STLのlistでの継承したクラスの関数が実行されない

Posted: 2010年10月24日(日) 15:41
by うしお
これはリストが原因ではなく、実体に対してコピーを行ったためです

class Base
{
public:
virtual ~Base(){}
virtual void DoSomething()
{
cout << "Base DoSomething" << endl;
}
};
class Dervied : public Base
{
public:
void DoSomething()
{
cout << "Dervied DoSomething" << endl;
}
};
という構成のときに
Base B;
Dervied D;
B = D;
B.DoSomething();
と書くのではなく、ポインタか参照であれば派生の関数がよばれます
Dervied D;
Base* B = &D;
B->DoSomething(); 画像

Re:STLのlistでの継承したクラスの関数が実行されない

Posted: 2010年10月24日(日) 15:43
by Poco
× list <object> lst;
○ list <object*> lst;

STLとスライシング辺りで調べると理由はわかります。

Re:STLのlistでの継承したクラスの関数が実行されない

Posted: 2010年10月24日(日) 16:28
by べす
うしお さん
ぽこ さん

すばやい回答ありがとうございました!
とりあえず、うしおさんのコードを見ながら
*をつけたり試してみたらうまく行きました!
後はぽこさんの言うスライシングを調べてきちんと理解できるようにしたいと思います

ありがとうございました