タイトルの通りです
長いですがソースを載せます
(インクルード省略)
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()
だと、親クラスの関数が実行されます
継承したクラスの関数を実行するにはどうすればいいんでしょうか?
よろしくお願いします
STLのlistでの継承したクラスの関数が実行されない
Re:STLのlistでの継承したクラスの関数が実行されない
これはリストが原因ではなく、実体に対してコピーを行ったためです
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();
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での継承したクラスの関数が実行されない
× list <object> lst;
○ list <object*> lst;
STLとスライシング辺りで調べると理由はわかります。
○ list <object*> lst;
STLとスライシング辺りで調べると理由はわかります。
Re:STLのlistでの継承したクラスの関数が実行されない
うしお さん
ぽこ さん
すばやい回答ありがとうございました!
とりあえず、うしおさんのコードを見ながら
*をつけたり試してみたらうまく行きました!
後はぽこさんの言うスライシングを調べてきちんと理解できるようにしたいと思います
ありがとうございました
ぽこ さん
すばやい回答ありがとうございました!
とりあえず、うしおさんのコードを見ながら
*をつけたり試してみたらうまく行きました!
後はぽこさんの言うスライシングを調べてきちんと理解できるようにしたいと思います
ありがとうございました