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;
}