有人可以請讓我擺脫這種痛苦嗎?我想弄清楚爲什麼派生的運算符==永遠不會在循環中調用。爲了簡化例子,這裏是我的基類和派生類:派生類中的運算符==永遠不會被調用
class Base { // ... snipped
bool operator==(const Base& other) const { return name_ == other.name_; }
};
class Derived : public Base { // ... snipped
bool operator==(const Derived& other) const {
return (static_cast<const Base&>(*this) ==
static_cast<const Base&>(other) ? age_ == other.age_ :
false);
};
現在,當我實例和比較像這樣...
Derived p1("Sarah", 42);
Derived p2("Sarah", 42);
bool z = (p1 == p2);
...一切都很好。從這裏衍生的==操作符被調用,但是當我遍歷一個列表,在指針的基本對象的列表進行比較的項目...
list<Base*> coll;
coll.push_back(new Base("fred"));
coll.push_back(new Derived("sarah", 42));
// ... snipped
// Get two items from the list.
Base& obj1 = **itr;
Base& obj2 = **itr2;
cout << obj1.asString() << " " << ((obj1 == obj2) ? "==" : "!=") << " "
<< obj2.asString() << endl;
這裏asString()
(這是虛擬的,而不是這裏顯示的簡潔)工作正常,但obj1 == obj2
總是調用Base
operator==
即使這兩個對象是Derived
。
我知道當我發現什麼是錯的時候我會踢自己,但是如果有人可以輕輕地讓我失望,那將是非常感謝。
這是有道理的。 「真正的」應用程序使用智能指針進行比較(不幸的是,不是Boost,而是與我正在工作的客戶端的「家庭釀造」),這更加複雜了。不過我會試試這個。值得慶幸的是,雖然這個集合使用了基本的智能指針,但由於上下文的原因,我可以合理確定這些對象都是共同的(派生的)類型。非常感謝。 – 2010-01-27 09:21:49
有趣的是,當我嘗試這個,我發現鏈基類運營商==造成 - 因爲它是虛擬的 - 調用派生運算符==(即無限遞歸)嗯... – 2010-01-27 17:02:19
@Robin:對不起,固定。 – Potatoswatter 2010-01-27 17:19:43