0

私は次のクラスを持っています

class A{
    operator<(A & object);  //how do i make it so hat B < C?
};

class B: public A{
    operator<(A & object);
};

class C: public A {
    operator<(A & object);
};
A * ptr = new B();
A * ptr2 = new C();

if (*ptr < *ptr2)   //how do I overload this?

< 関数をオーバーロードして、クラス B がクラス C より小さいことがわかるようにするにはどうすればよいですか?

4

1 に答える 1

0

Mooing Duck が言ったように、実行時に 2 つのオブジェクトを動的にバインドする必要がある場合は、二重ディスパッチを使用する必要があります。この場合、関連する型がほとんどないという単純な理由で実行できます。

呼び出しを仮想にすることから始めます。

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;
    virtual bool operator<(const C & object) const = 0;
};

次に、次のようにします。

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
    {
        //<do your logic>; // here you can assume both will be type B
    }
    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
    {
        //<do your logic>; // here you can assume both will be type C
    }
};

ここで行うことは、各オブジェクトの動的バインディングを行うことで、実行時に両方の型を認識します。

更新: 無限再帰を防ぐためにコードを少し変更しました。

于 2012-11-20T01:13:56.917 に答える