Я вижу две проблемы, которые вы должны решить или, по крайней мере, лучше понять. Они оба сводятся к тому, что вы не разрешили чисто виртуальное объявление в вашем базовом классе, ana
:
1) operator + (): Ваш класс baba
определяет оператор +, отличный от базового класса. В частности, ana::operator+()
является унарным оператором + (принимает только один операнд), в то время как baba::operator+(baba& ali)
является бинарным оператором (принимает два операнда) в baba
. Вы должны решить, какой использовать и использовать его. Если вы хотите использовать двоичный код + (который, как я думаю, вам нужно, учитывая ваше определение в baba
), вы объявляете в ana
:
virtual int operator+(const ana&) const =0;
и baba
:
virtual int operator+(const ana& ali) const {return x+ali.x; }
Почему это должен быть чисто виртуальный метод в ana
, поскольку x
определен в ana
, любопытно. Это будет делать интересные вещи, если у вас есть другие производные классы, которые делают вещи по-другому (потеря коммутативности, вероятно, приведет к этому). Но я полагаю, что у вас есть свои причины, поэтому я не буду допрашивать.
2) operator = (ana &): У вас также есть проблема с объявлениями оператора присваивания. Опять же, вы не решаете чисто виртуальный. В ana
у вас есть:
virtual void operator=(ana&)=0;
в то время как в baba
у вас есть: void operator=(baba &ali)
. Аргументы отличаются, поскольку baba&
не совпадает с ana&
; поэтому чисто виртуальное объявление снова не разрешено. Чтобы это исправить, вы, вероятно, захотите изменить объявление в ana
на:
virtual void operator=(const ana&)=0
и baba
:
virtual void operator=(const ana& ali) { x=ali.x; }
У меня есть похожие опасения относительно того, почему вы хотите объявить это как чисто виртуальное, поскольку, опять же, предполагается, что разные производные классы будут реализовывать его по-разному, что приводит к интересному поведению. Опять же, я уверен, что у вас есть свои причины.
Надеюсь, это поможет.