我有两个类像这样(简体和重命名):克++忽略覆盖虚函数
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
即基本::运算符()叫做。显然这不是我想要发生的事情。 我试图改变DoSomething的到
void doSomething(Base& obj)
但这只是如果与派生类对象,而不是一个从列表中直接调用工作。并且引用不能存储在列表中。
有什么办法可以让doSomething“看到”它必须调用派生类的函数(而不必诉诸指针)?
编辑:问题指出,对于谁可能会遇到这种这里其他人是一个链接: What is object slicing?
使用指向'Base'的指针,并检查是否可以'dynamic_cast'到'Derived'。 – chris 2012-04-29 14:49:35
@chris:这是错误的一半。建议使用指针是好的,但使用'dynamic_cast'的建议不是。没有必要施放,虚拟调度机制将选择正确的覆盖。 – 2012-04-29 15:05:19
http:// stackoverflow。com/questions/274626/what-is-slicing-problem-in-c – Flexo 2012-04-29 15:06:21