我有兩個類像這樣(簡體和重命名):克++忽略覆蓋虛函數
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