如何覆盖多态性的运算符

Val*_*ali 7 c++ polymorphism operator-overloading operators

任何人都可以向我解释我在这里做错了什么吗?

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;
};
Run Code Online (Sandbox Code Playgroud)

我所要做的就是将多态性的概念用于运算符,特别是运算符++.我希望得到这样的结果:


Base*base = new Derivate();

++ base <---应该从Derivate类中调用++


Base*base2 = ned Derivate_2();

++ base <---应该从Derivate_2类调用++


更新:

我的问题的当前解决方案是使用我已经知道的++(*base).

但有没有其他方法可以做++ base而不是++(*base)


谢谢您的帮助 :)

lub*_*bgr 9

在这两行中,

X *x_base = new OK(0);
++x_base;
Run Code Online (Sandbox Code Playgroud)

您创建一个指向新实例的指针,然后递增指针,而不是指针.永远不会调用类层次结构的增量运算符,而是调用指针的内置增量运算符.您可以通过首先取消引用指针来解决此问题:

++*x_base; // or ++(*x_base), might be more readable
Run Code Online (Sandbox Code Playgroud)

您也可以使用引用而不是指针,这允许增加语法而无需对指针进行反洗,例如

OK ok(0);
X& x_base = ok;

++x_base; // now, x_base is a reference, no need to dereference it
Run Code Online (Sandbox Code Playgroud)

请注意,调用的运算符重载的实现不会更改值X::x.该std::cout << x_base->x;增量后,建议您所期望的值是非零.

  • @Vali我认为这个答案表明你可以通过使变量`x`具有类型`X&`而不是`X*`来解决你的问题.然后`++ x`将作用于对象而不是指针.坦率地说,我认为这比其他答案要好. (2认同)