我有两个这样的类(简化和重命名):
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 “看到”它必须调用派生类的函数(不必求助于指针)?
编辑:指出了问题,对于可能遇到此问题的其他人来说,这里有一个链接: 什么是对象切片?