class B;
class C;
class A{
public:
virtual bool operator<(const A & object) const = 0; // I assume you only care about B and C
virtual bool operator<(const B & object) const = 0; // I assume you only care about B and C
virtual bool operator<(const C & object) const = 0; // I assume you only care about B and 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;
}
Y2xhc3MgQjsKY2xhc3MgQzsKCmNsYXNzIEF7CnB1YmxpYzoKICAgIHZpcnR1YWwgYm9vbCBvcGVyYXRvcjwoY29uc3QgQSAmIG9iamVjdCkgY29uc3QgPSAwOyAvLyBJIGFzc3VtZSB5b3Ugb25seSBjYXJlIGFib3V0IEIgYW5kIEMKICAgIHZpcnR1YWwgYm9vbCBvcGVyYXRvcjwoY29uc3QgQiAmIG9iamVjdCkgY29uc3QgPSAwOyAvLyBJIGFzc3VtZSB5b3Ugb25seSBjYXJlIGFib3V0IEIgYW5kIEMKICAgIHZpcnR1YWwgYm9vbCBvcGVyYXRvcjwoY29uc3QgQyAmIG9iamVjdCkgY29uc3QgPSAwOyAvLyBJIGFzc3VtZSB5b3Ugb25seSBjYXJlIGFib3V0IEIgYW5kIEMKfTsKCmNsYXNzIEI6IHB1YmxpYyBBewpwdWJsaWM6CiAgICB2aXJ0dWFsIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEEgJiBvYmplY3QpIGNvbnN0CiAgICB7CiAgICAgICAgLy8gZG8gYSBzZWNvbmQgYmluZCwgbm93IHRoYXQgd2Uga25vdyB0aGlzIGlzIHR5cGUgQi4gTmVnYXRlIGNhdXNlIHdlCiAgICAgICAgLy8gYXJlIHN3aXRjaGluZyB0aGUgb3BlcmFuZHMuCiAgICAgICAgcmV0dXJuICFvYmplY3Qub3BlcmF0b3I8KCAoY29uc3QgQiYpKnRoaXMpOwogICAgfQogICAgdmlydHVhbCBib29sIG9wZXJhdG9yPChjb25zdCBCICYgb2JqZWN0KSBjb25zdAogICAgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgdmlydHVhbCBib29sIG9wZXJhdG9yPChjb25zdCBDICYgb2JqZWN0KSBjb25zdAogICAgewogICAgICAgIHJldHVybiB0cnVlOyAvLyBCIGlzIGFsd2F5cyA8IHRoYW4gQyByaWdodD8KICAgIH0KfTsKCmNsYXNzIEM6IHB1YmxpYyBBewpwdWJsaWM6CiAgICB2aXJ0dWFsIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEEgJiBvYmplY3QpIGNvbnN0CiAgICB7CiAgICAgICAgLy8gZG8gYSBzZWNvbmQgYmluZCwgbm93IHRoYXQgd2Uga25vdyB0aGlzIGlzIHR5cGUgQy4gTmVnYXRlIGNhdXNlIHdlCiAgICAgICAgLy8gYXJlIHN3aXRjaGluZyB0aGUgb3BlcmFuZHMuCiAgICAgICAgcmV0dXJuICFvYmplY3Qub3BlcmF0b3I8KCAoY29uc3QgQyYpKnRoaXMpOwogICAgfQogICAgdmlydHVhbCBib29sIG9wZXJhdG9yPChjb25zdCBCICYgb2JqZWN0KSBjb25zdAogICAgewogICAgICAgIHJldHVybiBmYWxzZTsgLy8gQyBpcyBhbHdheXMgPiB0aGVuIEIgcmlnaHQ/CiAgICB9CiAgICB2aXJ0dWFsIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEMgJiBvYmplY3QpIGNvbnN0CiAgICB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9Cn07CgppbnQgbWFpbigpIHsKICAgQSogYTEgPSBuZXcgQigpOwogICBBKiBhMiA9IG5ldyBDKCk7CiAgIGJvb2wgciA9ICphMSA8ICphMjsKfQ==