繁体   English   中英

如何覆盖多态性的运算符

[英]How to override an operator for polymorphism

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

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; 在增量表明您希望该值为非零之后。

要解决第二个问题,您需要为指针类编写一个包装器。 就像是

class XPtr
{
public:
    XPtr(X* p) : ptr(p) {}
    X* operator->() { return ptr; }
    X& operator*() { return *ptr; }
    XPtr& operator++() { ++*ptr; return *this; }
private:
    X* ptr;
};

int main() {
    XPtr x_base = new OK(0);
    ++x_base;
    std::cout << x_base->x;
    return 1;
};

不要这样做。

首先,使用++表示+= 10*= 5应该可能会让你被解雇。

算术运算符用于实际表现为数学对象或指针/迭代器的事物。 从这个意义上讲,几乎没有理由让任何此类对象表现出任何运行时多态性。

在按指示使用++之后,最好不要迭代任何struct MUstruct OK数组。

运行时多态性是最后的工具。 除非你确实需要它,否则不要打扰它。

最好的解决方案是摆脱虚拟和继承层次结构以及覆盖。 如果做不到这一点,你应该只命名函数而不是使用运算符。

这不是一个好主意。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM