Перегрузка бинарного оператора› в производном классе в c++

Я искал повсюду конкретный ответ на этот вопрос и не нашел. Я пытаюсь создать базовый класс с виртуальным оператором>, который я могу переопределить в производном классе. В настоящее время у меня проблемы, потому что для объявления функции требуется только одна входная переменная (как в «bool operator> (Derived & a)», но попытка определить ее в файле cpp говорит мне, что для нее требуется два входа (как в «логическом операторе > (Производный и а, Производный и б))

Я пытался определить встроенный оператор, но затем получаю ошибки, когда он считает производный класс все еще абстрактным, потому что я передаю производный тип оператору, как показано выше, вместо базового класса. Но если я передам базовый класс, я не смогу получить доступ к производным переменным-членам, которые мне нужны для сравнения.

Я думаю, что мне не хватает чего-то простого здесь, но я не могу понять, что это такое.

Надеюсь, вы можете помочь. Спасибо


person user1971357    schedule 11.01.2013    source источник
comment
Вы определили его как bool Derived::operator>(Derived &a) ...?   -  person Nate Kohl    schedule 12.01.2013
comment
О виртуальном операторе сравнения немного сложно рассуждать. Как вы хотите сравнить два объекта, которые имеют разные типы?   -  person Kerrek SB    schedule 12.01.2013
comment
Я хочу сравнить объекты, которые имеют одинаковые типы, но я не буду знать, какой тип будет использоваться. Я хотел бы разрешить каждому типу указывать свой собственный оператор сравнения, чтобы независимо от того, что сравнивается, могло произойти правильное сравнение.   -  person user1971357    schedule 12.01.2013


Ответы (3)


Чтобы виртуальные вызовы работали из ссылки/указателя базы, вам нужно будет использовать базовый тип в функции, например

class Derived : public Base
{
    .... 
    bool operator>(Base &a)
    {
         Derived *pa = dynamic_cast<Derived *>(&a);
         return this->something > pa->something;   // Or whatever... 
    }

   .... 
};

Если вы измените тип, он станет другой функцией, и когда вы используете базовый указатель или ссылку для ссылки на оператор>, он будет использовать тот, что находится в базовом классе.

person Mats Petersson    schedule 11.01.2013
comment
reinterpret_cast здесь? Да ладно, это вариант использования dynamic_cast! - person Matteo Italia; 12.01.2013
comment
Но не будет ли аргумент слева от › Базой? Мне нужно, чтобы оба были получены. - person user1971357; 12.01.2013

Почему бы вам не оставить operator>() не виртуальным и не вызывать личную виртуальную функцию?

Вот так:

class Base {
public:
    bool operator>(Base &a) {
        return implementingFunction(a);
    }

private:
    virtual bool implementingFunction(Base &a) = 0;
};
person lethal-guitar    schedule 11.01.2013
comment
И это решает какую именно проблему? Вам все равно придется иметь ту же подпись и выполнять какое-то преобразование между базовым и производным классом внутри реализации. Если мы выполним общую функцию типа compare(a, b), которая возвращает -1, 0, +1 (или что-то в этом роде) для меньше, равно и больше, то это имеет смысл. Но если нам просто нужна функция «меньше чем», то я не вижу смысла [но, может быть, я что-то здесь упускаю]. - person Mats Petersson; 12.01.2013

person    schedule
comment
Я столкнулся с проблемой, когда тот факт, что базовый оператор принимает базовый объект, в то время как производный оператор принимает производный объект, я получаю ошибки компилятора, когда пытаюсь вызвать функцию (передавая указатель на базу), которая кажется причина по наследству, фактически не встречающаяся. Ваш код предполагает, что наличие разных входных аргументов не будет проблемой, так что вы знаете, почему это может происходить? - person user1971357; 12.01.2013