У меня есть абстрактный базовый класс, и мне нужно реализовать чистые виртуальные операторы поста и предварительного приращения из-за домашней работы.
virtual Base & operator ++ () = 0;
virtual Base operator ++ (int ignore) = 0;
Возникла проблема с нарезкой. Что мне делать для реализации определения производного класса. Шаблон не является решением этой домашней работы, потому что он не подходит для всей домашней работы.
Кто-то отвечает за эту домашнюю работу, не так ли? Скажите им, что в их задаче есть фундаментальные проблемы
У этих операторов я меняю член производного класса. Но я не могу получить к нему доступ. Я пытался использовать указатели, но возникла проблема с разрезанием.
Однако вы можете поместить соответствующую переменную-член в класс bass. Я не знаю, при каких обстоятельствах это имеет смысл, но хорошо. Лучше всего предоставить минимальный воспроизводимый пример, чтобы показать, что вы пробовали до сих пор, и где возникает проблема.





Действительно, в производном классе этот оператор постфиксного приращения привел бы к нарезанному объекту.
struct Base
{
virtual Base& operator++() = 0;
virtual Base operator++(int) = 0;
};
struct Derived : Base
{
void inc();
virtual Base& operator++ () { inc(); return *this; } // no slicing
virtual Base operator++(int) { auto self = *this; inc(); return self; } // slicing
};
What should I do for implementing derived class definition.
Я считаю, что виртуальный оператор - это красный флаг и недостаток дизайна. По возможности избегайте этого.
Если «из-за домашней работы» вы застряли в нем, вы можете смягчить его возвращаемый тип и создать неканонический постфиксный оператор.
#include <memory>
struct Base
{
virtual Base& operator++() = 0;
virtual std::unique_ptr<Base> operator++(int) = 0;
};
Это станет большим (я имею в виду сильным, а не хорошим) сюрпризом для пользователя класса:
void f(Derived&);
Derived d;
f(*d++); // this is *weird*
Что вы имеете в виду «Возникла проблема с нарезкой»., не могли бы вы пояснить, что в вашем вопросе, пожалуйста?