Как решить проблему нарезки с помощью виртуального постфиксного оператора? - PullRequest
0 голосов
/ 24 декабря 2018

У меня есть абстрактный базовый класс, и я должен реализовать чисто виртуальные операторы post и pre-increment из-за домашней работы.

virtual Base & operator ++ () = 0;
virtual Base operator ++ (int ignore) = 0;

Существует проблема срезания.Что я должен сделать для реализации определения производного класса.Шаблон не является решением этой домашней работы, потому что она не подходит для всей домашней работы.

1 Ответ

0 голосов
/ 24 декабря 2018

Действительно, в производном классе этот оператор приращения постфикса приведет к нарезанному объекту.

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*
...