Перегрузка бинарного оператора & gt; в производном классе в переполнении стека

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

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

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

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

0

Решение

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

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

....
};

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

0

Другие решения

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

Вот так:

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

private:
virtual bool implementingFunction(Base &a) = 0;
};
0

#include <iostream>
using namespace std;
class base{
public :
virtual bool operator> (base& obj) { cout<<"b\n";return true;}
virtual ~base(){}
};

class derived: public base{
public:
virtual bool operator> (derived& obj) { cout<<"d\n";return true;}
~derived(){}
};

int main()
{

base *a=new derived(),b;
if(*a>b) { delete a; cout<<"Done!\n"; }

return 0;
}
0
По вопросам рекламы [email protected]