Я много раз искал конкретный ответ на этот вопрос и не могу его найти. Я пытаюсь создать базовый класс с виртуальным оператором>, который я могу переопределить в производном классе. В настоящее время у меня возникают проблемы, потому что для объявления функции требуется только одна входная переменная (как в «bool operator> (Derived) & a) «но попытка определить его в файле cpp говорит мне, что для этого требуется два ввода (как в» bool operator> (Derived) & а, производный & б))
Я попытался определить встроенный оператор, но затем я получаю ошибки, когда он считает, что производный класс все еще абстрактный, потому что я передаю производный тип оператору, как показано выше, вместо базового класса. Но если я пропущу базовый класс, то не смогу получить доступ к производным переменным-членам, которые мне нужны для сравнения.
Я думаю, что я упускаю что-то простое здесь, но я не могу понять, что это такое.
Надеюсь, вы можете помочь.
Спасибо
Чтобы виртуальные вызовы работали со ссылкой / указателем базы, вам нужно будет использовать базовый тип в функции, например,
class Derived : public Base
{
....
bool operator>(Base &a)
{
Derived *pa = dynamic_cast<Derived *>(&a);
return this->something > pa->something; // Or whatever...
}
....
};
Если вы измените тип, он станет другой функцией, и когда вы используете базовый указатель или ссылку для ссылки на operator>, он будет использовать тот, который указан в базовом классе.
Почему бы тебе не уйти operator>()
не виртуальный, и он вызывает частную виртуальную функцию?
Вот так:
class Base {
public:
bool operator>(Base &a) {
return implementingFunction(a);
}
private:
virtual bool implementingFunction(Base &a) = 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;
}