如何解决虚拟后缀运算符的切片问题?
How to solve a slicing issue with a virtual postfix operator?
我有一个抽象基础class,由于家庭作业,我必须实现纯虚拟post和预增量运算符。
virtual Base & operator ++ () = 0;
virtual Base operator ++ (int ignore) = 0;
切片有问题。我应该怎么做才能实现派生的 class 定义。模板不是这个作业的解决方案,因为它不适合整个作业。
确实,在派生的 class 中,此后缀增量运算符将导致切片对象。
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.
我认为虚拟运营商是一个危险信号和设计缺陷。尽可能避免。
如果,"because of homework" 你坚持使用它,你可以调整它的 return 类型并制作一个 non-canon postfix operator。
#include <memory>
struct Base
{
virtual Base& operator++() = 0;
virtual std::unique_ptr<Base> operator++(int) = 0;
};
这会给 class 用户一个很大的惊喜(我的意思是很强,不是很好):
void f(Derived&);
Derived d;
f(*d++); // this is *weird*
我有一个抽象基础class,由于家庭作业,我必须实现纯虚拟post和预增量运算符。
virtual Base & operator ++ () = 0;
virtual Base operator ++ (int ignore) = 0;
切片有问题。我应该怎么做才能实现派生的 class 定义。模板不是这个作业的解决方案,因为它不适合整个作业。
确实,在派生的 class 中,此后缀增量运算符将导致切片对象。
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.
我认为虚拟运营商是一个危险信号和设计缺陷。尽可能避免。
如果,"because of homework" 你坚持使用它,你可以调整它的 return 类型并制作一个 non-canon postfix operator。
#include <memory>
struct Base
{
virtual Base& operator++() = 0;
virtual std::unique_ptr<Base> operator++(int) = 0;
};
这会给 class 用户一个很大的惊喜(我的意思是很强,不是很好):
void f(Derived&);
Derived d;
f(*d++); // this is *weird*