Действительно, в производном классе этот оператор приращения постфикса приведет к нарезанному объекту.
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
};
Что я должен сделать для реализации определения производного класса.
Мое мнение таково, что виртуальный оператор - это красный флаг и недостаток дизайна.Избегайте этого, если это возможно.
Если «из-за домашней работы» вы застряли с ним, вы можете умерить его тип возвращаемого значения и создать неканонический постфиксный оператор .
#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*