c ++如何继承返回特定类型的运算符

时间:2011-09-30 18:36:57

标签: c++ polymorphism

我有一个覆盖+运算符的类'A'和一个子类'B'。

我想继承'A'+运算符但不是返回类型A我想返回类型B.

我该怎么做呢?我尝试从B调用父操作符并将结果转换为A对象,但它不允许我将父项转换为子项

我的+运算符能以某种方式返回一个通用的'A'指针吗?

3 个答案:

答案 0 :(得分:2)

它可能 - 没有技术原因它不能 - 它只是违反了使用运营商时的一些期望。因此,如果这是自己的代码,那就去吧,但如果它会被其他人阅读或使用,我会重新考虑以下原因:

  1. 预期的行为是,+=*=等运算符在修改该对象后返回对它们被调用的对象的引用。像+*这样的运算符返回一个新对象(它们几乎必须这样做,因为暗示它们被调用的对象不会被更改)。它们不会返回指向新对象的指针,因为:
  2. 没有人期望他们这样做,所以他们不会想到delete他们从操作员那里得到的对象,这会导致内存泄漏,并且:
  3. 你不能链接返回指针的运算符;类似MyClass a = b + c + d;的表达式将不起作用,因为返回类型(MyClass*)与您需要传递给运算符的参数类型(可能是const MyClass&)不匹配。
  4. 引用返回给新对象可以让你解决#3问题,并且仍然支持多态,但是你仍然坚持使用#2,而这是对的更糟糕的。这同样适用于重载操作符以获取指针或引用。
  5. 最终,只要做任何让生活中最容易使用代码的人 - 如果它只是你,你可以做任何你想做的事情。如果它会落入别人的手中,请小心,因为他们做出假设。

    希望这有帮助!

    编辑:返回对新对象的引用的示例:

    A& A::operator + (const A& other) const
    {
        A* temp = new A(); // <- This is why it's a potential memory leak
        /* Do some stuff */
        return *temp;
    }
    

    但是,我有更多的时间来考虑这个问题,我提出了另一种选择:为B定义一个=运算符,它将A作为其参数。然后你可以做这样的事情:

    B b1;
    B b2;
    B b3 = b1 + b2;
    

    b1 + b2返回A并不重要,因为它在=期间被转换回B.如果这适合你,我建议它高于任何其他方法,因为它让所有操作员都有预期的行为。

答案 1 :(得分:2)

我经常看到它以下列方式完成:

class A {
    int a;
    A(int rhs) :a(rhs) {} 
public:
    A& operator+=(const A& rhs) {a+=rhs.a; return *this} 
    A operator+(const A& rhs) {return a+rhs.a;} 
};

class B : public A {
    int b;
public:
    B(const B& rhs) :A(rhs), b(rhs.b) {}
//                               VVVVVVVVVVVVVVVVVV
    B& operator+=(const B& rhs) {A::operator+=(rhs); b+=rhs.b; return *this;}
    B operator+(const B& rhs) {return B(*this)+=rhs;}
};

答案 2 :(得分:1)

解决此问题的最简单方法是根据operator+实施operator+=。粗略地说:

A::operator+=(const A& right) { /* stuff */ }
B::operator+=(const B& right) { static_cast<A&>(*this) += right; /* stuff */ }
operator+(B left, const B& right) { return B += right; }