gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:48:12 26 4
gpt4 key购买 nike

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

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

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

我的 + 运算符能否以某种方式返回通用“A”指针或其他内容?

最佳答案

它可以 - 没有技术原因它不能 - 它只是在使用运算符时违反了一些预期。因此,如果这是您自己的代码,请使用它,但如果它要被其他人阅读或使用,我会重新考虑,原因如下:

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

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

希望这对您有所帮助!

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

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。如果这对您有用,我会推荐它胜过任何其他方法,因为它可以让所有运算符都有预期的行为。

关于c++如何继承返回特定类型的运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7614625/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com