c++如何继承返回特定类型的操作符
c++ how to inherit operator that returns specific type
我有一个覆盖+操作符的类' a '和一个子类'B'。
我想继承'A'的+运算符,但不是返回类型A,而是返回类型b。
我该怎么做呢?我试着从B调用父操作符并将结果转换为A对象,但它不会让我将父对象转换为子对象
我的+操作符能以某种方式返回一个通用的' a '指针或什么?
它可以——没有技术上的原因——它只是在使用操作符时违反了一些期望。所以,如果这是你自己的代码,那就去写吧,但如果它要被其他人阅读或使用,我会重新考虑以下原因:
- 期望的行为是,像
+=
和*=
这样的操作符在修改对象后返回对其调用的对象的引用。像+
和*
这样的操作符返回一个新对象(它们几乎必须这样做,因为这意味着调用它们的对象没有改变)。它们不返回指向新对象的指针,因为: - 没有人期望他们这样做,所以他们不会想到
delete
他们从操作符返回的对象,这会导致内存泄漏,并且: - 你不能链接返回指针的操作符;像
MyClass a = b + c + d;
这样的表达式将不起作用,因为返回类型(MyClass*
)与需要传递给操作符的参数类型(可能是const MyClass&
)不匹配。 - 将引用返回给一个新对象,使您可以绕过#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; }
相关文章:
- 我可以将C 17 Capture lambda ConstexPR转换操作符的结果用作函数指针模板非类型参数吗?
- 清楚地说明 * 和 & 作为类型的一部分和作为取消引用/address_of操作符之间的区别
- sizeof操作符是否优先选择对象而不是类型
- 重载操作符+:表达式必须是整型或无作用域枚举类型
- 模板类型转换操作符=
- 我如何使用“函数调用操作符”来加载“右值”类型到我的对象
- 通过操作符[]在map中插入指针类型的值总是NULL
- C搜索字符串如果类型字符,int类型,操作符类型
- 为什么模板化的用户定义转换操作符能够确定其返回类型?
- c++模板赋值操作符重载——赋基本类型给对象
- 在可强制转换为另一个模板类型的类模板中重载赋值操作符
- c++操作符重载以指针类型作为参数
- c++模板操作符重载不同类型,自动返回类型
- 重载操作符类型错误
- 使用c++中的流操作符解析std::uint类型
- 基本数据类型的相等操作符Vs memcmp的性能
- 赋值操作符的返回类型是什么?
- 函数模板内的解除类型和范围解析操作符
- 使用new操作符在不知道对象类型的情况下将其复制到堆中
- 重载操作符返回类型