我有一个覆盖+运算符的类'A'和一个子类'B'。
我想继承'A'+运算符但不是返回类型A我想返回类型B.
我该怎么做呢?我尝试从B调用父操作符并将结果转换为A对象,但它不允许我将父项转换为子项
我的+运算符能以某种方式返回一个通用的'A'指针吗?
答案 0 :(得分:2)
它可能 - 没有技术原因它不能 - 它只是违反了使用运营商时的一些期望。因此,如果这是自己的代码,那就去吧,但如果它会被其他人阅读或使用,我会重新考虑以下原因:
+=
和*=
等运算符在修改该对象后返回对它们被调用的对象的引用。像+
和*
这样的运算符返回一个新对象(它们几乎必须这样做,因为暗示它们被调用的对象不会被更改)。它们不会返回指向新对象的指针,因为:delete
他们从操作员那里得到的对象,这会导致内存泄漏,并且:MyClass a = b + c + d;
的表达式将不起作用,因为返回类型(MyClass*
)与您需要传递给运算符的参数类型(可能是const MyClass&
)不匹配。最终,只要做任何让生活中最容易使用代码的人 - 如果它只是你,你可以做任何你想做的事情。如果它会落入别人的手中,请小心,因为他们会做出假设。
希望这有帮助!
编辑:返回对新对象的引用的示例:
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; }