Может ли кто-нибудь пожалуйста избавить меня от моих страданий этим? Я пытаюсь выяснить, почему производный оператор == никогда не вызывается в цикле. Чтобы упростить пример, вот мой класс Base и Derived:
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 );
... все хорошо. Здесь вызывается оператор == из Derived, но когда я зацикливаюсь на списке, сравнивая элементы в списке указателей с объектами Base ...
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
.
Я знаю, что собираюсь надрать себя, когда узнаю, что не так, но если бы кто-то мог мягко подвести меня, это было бы очень признательно.