Re: Virtual operator overloads don't seem to work?
On 22 Oct, 23:29, Sam <s...@email-scan.com> wrote:
Stuart Brockman writes:
Hi,
I don't quite get what is going on in this code example:
---------------------------
#include <iostream>
using namespace std;
class Base{
public:
virtual void Test(){
cout << "Base" << endl;
}
virtual bool operator==(const Base &other){
cout << "Base Comparison" << endl;
return false;
}
};
class Derived : public Base{
public:
void Test(){
cout << "Derived" << endl;
}
bool operator==(const Derived &other){
cout << "Derived Comparison" << endl;
return true;
}
};
int main(int argc, char** argv) {
Base a; //Create a base object
a.Test(); //Outputs "Base" as expected
Derived b, c; //Create two derived objects
b.Test(); //Outputs "Derived" as expected
if(b==c) cout << "True" << endl; //Does derived comp=
arison and
returns true as expected.
Base *d=&b, *e=&c; //Create two base pointers to derived=
objects
d->Test(); //Outputs "Derived" as expected
if(*d==*e) cout << "True" << endl; //Does base compariso=
n and
returns false!?
return 0;
}
----------------------------
The output is:
Base
Derived
Derived Comparison
True
Derived
Base Comparison
Notice, that the line "d->Test()" works correctly, but the comparison
on the next line does not. The compiler (g++ (GCC) 4.2.3 (Ubuntu
4.2.3-2ubuntu7) ) seems to be ignoring the virtual-ness of
Base::operator== .
That's because "bool operator==(const Derived &)" does not polymorphi=
cally
overload "bool operator==(const Base &)". In a derived class, the fun=
ction's
signature must match the base class's virtual function, in order for it t=
o
be polymorphically overloaded (the function parameters must match). In yo=
ur
case, above, you have two different functions, no different that void foo=
()
and void bar(). One does not overload the other.
Is this correct?
Yes.
=
Have I made a mistake?
Yes, but a very natural one.
application_pgp-signature_part
< 1KViewDownload
Ahh... I see... So what should I change Derived::operator== to?
Clearly it would have to have a signature of bool
Derived::operator==(const Base &other), but how do I make sure that I
get correct behavior when doing a "Derived==Base" (I would prefer that
Base::operator== was called in this case)?