class A{
public:
virtual bool operator<(const A & object) const = 0; // I assume you only care about B and C
};
class C;
class B: public A{
public:
virtual bool operator<(const A & object) const
{
// do a second bind, now that we know this is type B. Negate cause we
// are switching the operands.
return !object.operator<( (const B&)*this);
}
virtual bool operator<(const B & object) const
{
return true;
}
virtual bool operator<(const C & object) const
{
return true; // B is always < than C right?
}
};
class C: public A{
public:
virtual bool operator<(const A & object) const
{
// do a second bind, now that we know this is type C. Negate cause we
// are switching the operands.
return !object.operator<( (const C&)*this);
}
virtual bool operator<(const B & object) const
{
return false; // C is always > then B right?
}
virtual bool operator<(const C & object) const
{
return true;
}
};
int main() {
A* a1 = new B();
A* a2 = new C();
bool r = *a1 < *a2;
}
Y2xhc3MgQXsKcHVibGljOgogICAgdmlydHVhbCBib29sIG9wZXJhdG9yPChjb25zdCBBICYgb2JqZWN0KSBjb25zdCA9IDA7IC8vIEkgYXNzdW1lIHlvdSBvbmx5IGNhcmUgYWJvdXQgQiBhbmQgQwp9OwoKY2xhc3MgQzsKCmNsYXNzIEI6IHB1YmxpYyBBewpwdWJsaWM6CiAgICB2aXJ0dWFsIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEEgJiBvYmplY3QpIGNvbnN0CiAgICB7CiAgICAgICAgLy8gZG8gYSBzZWNvbmQgYmluZCwgbm93IHRoYXQgd2Uga25vdyB0aGlzIGlzIHR5cGUgQi4gTmVnYXRlIGNhdXNlIHdlCiAgICAgICAgLy8gYXJlIHN3aXRjaGluZyB0aGUgb3BlcmFuZHMuCiAgICAgICAgcmV0dXJuICFvYmplY3Qub3BlcmF0b3I8KCAoY29uc3QgQiYpKnRoaXMpOwogICAgfQogICAgdmlydHVhbCBib29sIG9wZXJhdG9yPChjb25zdCBCICYgb2JqZWN0KSBjb25zdAogICAgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgdmlydHVhbCBib29sIG9wZXJhdG9yPChjb25zdCBDICYgb2JqZWN0KSBjb25zdAogICAgewogICAgICAgIHJldHVybiB0cnVlOyAvLyBCIGlzIGFsd2F5cyA8IHRoYW4gQyByaWdodD8KICAgIH0KfTsKCmNsYXNzIEM6IHB1YmxpYyBBewpwdWJsaWM6CiAgICB2aXJ0dWFsIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEEgJiBvYmplY3QpIGNvbnN0CiAgICB7CiAgICAgICAgLy8gZG8gYSBzZWNvbmQgYmluZCwgbm93IHRoYXQgd2Uga25vdyB0aGlzIGlzIHR5cGUgQy4gTmVnYXRlIGNhdXNlIHdlCiAgICAgICAgLy8gYXJlIHN3aXRjaGluZyB0aGUgb3BlcmFuZHMuCiAgICAgICAgcmV0dXJuICFvYmplY3Qub3BlcmF0b3I8KCAoY29uc3QgQyYpKnRoaXMpOwogICAgfQogICAgdmlydHVhbCBib29sIG9wZXJhdG9yPChjb25zdCBCICYgb2JqZWN0KSBjb25zdAogICAgewogICAgICAgIHJldHVybiBmYWxzZTsgLy8gQyBpcyBhbHdheXMgPiB0aGVuIEIgcmlnaHQ/CiAgICB9CiAgICB2aXJ0dWFsIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEMgJiBvYmplY3QpIGNvbnN0CiAgICB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9Cn07CgppbnQgbWFpbigpIHsKICAgQSogYTEgPSBuZXcgQigpOwogICBBKiBhMiA9IG5ldyBDKCk7CiAgIGJvb2wgciA9ICphMSA8ICphMjsKfQ==