如何使用虚拟后缀运算符解决切片问题



>我有一个抽象的基类,由于家庭作业,我必须实现纯虚拟的后期和预增量运算符。

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

存在切片问题。我应该怎么做才能实现派生类定义。模板不是这个家庭作业的解决方案,因为它不适合整个家庭作业。

实际上,在派生类中,此后缀增量运算符将导致切片对象。

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*

相关内容

最新更新