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

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

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

#1

投稿記事 by べす » 14年前

タイトルの通りです
長いですがソースを載せます

(インクルード省略)
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での継承したクラスの関数が実行されない

#2

投稿記事 by うしお » 14年前

これはリストが原因ではなく、実体に対してコピーを行ったためです

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(); 画像

Poco

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

#3

投稿記事 by Poco » 14年前

× list <object> lst;
○ list <object*> lst;

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

べす

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

#4

投稿記事 by べす » 14年前

うしお さん
ぽこ さん

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

ありがとうございました

閉鎖

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