gpt4 book ai didi

c++ - 如何解决虚拟后缀运算符的切片问题?

转载 作者:行者123 更新时间:2023-11-28 04:27:37 24 4
gpt4 key购买 nike

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

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
};

What should I do for implementing derived class definition.

我的观点是,虚拟运营商是一个危险信号和设计缺陷。尽可能避免它。

如果“因为家庭作业”你坚持使用它,你可以调整它的返回类型并制作一个 non-canon postfix operator .

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

关于c++ - 如何解决虚拟后缀运算符的切片问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53912092/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com