c++如何继承返回特定类型的操作符

c++ how to inherit operator that returns specific type

本文关键字:类型 操作符 返回 何继承 继承 c++      更新时间:2023-10-16

我有一个覆盖+操作符的类' a '和一个子类'B'。

我想继承'A'的+运算符,但不是返回类型A,而是返回类型b。

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

我的+操作符能以某种方式返回一个通用的' a '指针或什么?

它可以——没有技术上的原因——它只是在使用操作符时违反了一些期望。所以,如果这是你自己的代码,那就去写吧,但如果它要被其他人阅读或使用,我会重新考虑以下原因:

  1. 期望的行为是,像+=*=这样的操作符在修改对象后返回对其调用的对象的引用。像+*这样的操作符返回一个新对象(它们几乎必须这样做,因为这意味着调用它们的对象没有改变)。它们不返回指向新对象的指针,因为:
  2. 没有人期望他们这样做,所以他们不会想到delete他们从操作符返回的对象,这会导致内存泄漏,并且:
  3. 你不能链接返回指针的操作符;像MyClass a = b + c + d;这样的表达式将不起作用,因为返回类型(MyClass*)与需要传递给操作符的参数类型(可能是const MyClass&)不匹配。
  4. 引用返回给一个新对象,使您可以绕过#3,并且仍然支持多态性,但您仍然坚持使用#2,这是两者中最糟糕的。重载操作符以获取指针或引用也是如此。

最终,只要让将要使用代码的人的生活更轻松就可以了——如果只有你,你可以做任何你想做的事情。只是要小心,如果它落入别人的手中,因为他们会做出假设。

希望这对你有帮助!

Edit:返回对新对象的引用的示例:

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。如果这对你有效,我推荐它比任何其他方法,因为它让所有的操作符有预期的行为。

我经常看到这样做:

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;}
};

解决这个问题最简单的方法是根据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; }