c++ - 如何为多态性覆盖运算符
问题描述
谁能向我解释我在这里做错了什么?
struct X {
int x{};
explicit X(int x) : x(x) {}
virtual X &operator++() = 0;
};
struct OK : X {
int ok{};
explicit OK(int ok) : X(ok), ok(ok) {}
X &operator++() override {
ok += 10;
return *this;
}
};
struct MU : X {
int mu{};
explicit MU(int mu) : X(mu), mu(mu) {}
X &operator++() override {
mu *= 5;
return *this;
}
};
int main() {
X *x_base = new OK(0);
++x_base;
std::cout << x_base->x;
return 1;
};
我要做的就是将多态性的概念用于运算符,特别是运算符++。我想要这样的结果:
Base* base = new Derivate();
++base <--- 应该从 Derivate 类调用 ++
Base* base2 = ned Derivate_2();
++base <--- 应该从 Derivate_2 类调用 ++
更新:
我的问题的当前解决方案是使用我已经知道的++(*base) 。
但是有没有其他方法可以做++base而不是++(*base)?
谢谢您的帮助 :)
解决方案
在这两行中,
X *x_base = new OK(0);
++x_base;
您创建一个指向新实例的指针,然后递增指针,而不是指针。永远不会调用类层次结构的增量运算符,而是调用内置的指针增量运算符。您可以通过首先取消引用指针来解决此问题:
++*x_base; // or ++(*x_base), might be more readable
您还可以使用引用而不是指针,这允许在不需要取消引用指针的情况下使用增量语法,例如
OK ok(0);
X& x_base = ok;
++x_base; // now, x_base is a reference, no need to dereference it
请注意,调用的运算符重载的实现不会更改X::x
. std::cout << x_base->x;
增量之后表明您希望该值不为零。
推荐阅读
- apostrophe-cms - Array 字段类型内的撇号中的动态选择字段
- c# - 如何使用锚标签将 id 传递给控制器并在浏览器 url 中仅显示名称
- reactjs - 为什么当道具改变时组件不重新渲染?
- javascript - 如果在事件处理程序之前或之间有等待调用,React 不会在事件处理程序中批处理 setState 调用
- android - 使用 Wifi direct/Wifi p2p 连接两个以上的设备
- spring-boot - Spring Boot 找不到 JMockit.class
- javascript - 通过 iis 在共享文件夹中搜索
- xlsx - Kotlin Native 的 XLSX 库
- python-3.x - 重新采样纬度点列表
- python - 在 matplotlib 中使用对数刻度来获取大的记录值而不会溢出