私はこのような2つのクラスを持っています(簡略化され、名前が変更されました):
class Base
{
public:
virtual void operator()( ) { cout << "Base\n";}
};
class Derived : public Base
{
public:
void operator()( ) { cout << "Derived\n"; }
};
void doSomething( Base obj )
{
obj( );
}
int main( )
{
list<Base> bList;
Derived d1, d2, d3;
bList.push_back( d1 );
bList.push_back( d2 );
bList.push_back( d3 );
for( list<Base>::iterator it = bList.begin(); it != bList.end(); it++ )
{
doSomething( *it );
}
return 0;
}
これを実行すると、次のようになります。
Base
Base
Base
つまり、Base :: operator()が呼び出されます。明らかに、これは私がしたいことではありません。doSomethingをに変更してみました
void doSomething( Base& obj )
ただし、これはDerivedオブジェクトで直接呼び出された場合にのみ機能し、リストのオブジェクトでは機能しません。また、参照をリストに保存することはできません。
doSomethingを(ポインターに頼る必要なしに)派生クラスの関数を呼び出さなければならないことを「見る」ようにする方法はありますか?
編集:問題が指摘されています、これに遭遇するかもしれない他の人々のためにここにリンクがあります: オブジェクトスライスとは何ですか?