如何使用虚拟后缀运算符解决切片问题
How to solve a slicing issue with a virtual postfix operator?
>我有一个抽象的基类,由于家庭作业,我必须实现纯虚拟的后期和预增量运算符。
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*
相关文章:
- 运行同一解决方案的另一个项目的项目
- Project Euler问题4的错误解决方案
- Ardunio UNO解决了多个重叠的定时器循环
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 两个文件使用彼此的功能-如何解决
- 计算每个节点的树高,帮助我解释这个代码解决方案
- 如何解决"invalid conversion from 'char' to 'const char*'"
- 在java中解决这段代码时面临循环中的问题
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- 难以理解某些人解决IOI问题的源代码
- visual c++,如何获取解决方案目录中的代码
- 如何解决错误:SCIP C++中的 SCIP 阶段无效 <10>
- 节俭并发:未解决的外部问题
- IpOpt拒绝解决不受约束的问题
- 如何解决这个超硬恒星的创造问题
- 循环无限运行C++解决骑士之旅问题
- 有没有办法在远程设备上打开和编辑visual Studio 2017解决方案
- 如何使用虚拟后缀运算符解决切片问题
- C++切片的潜在解决方案
- 如何使用GoogleMock解决此对象切片问题