gpt4 book ai didi

C++ 运算符重载或重新定义?

转载 作者:太空狗 更新时间:2023-10-29 21:41:30 24 4
gpt4 key购买 nike

我想为 Point+Point 和 Point+vector 重载 +

class Vector
{
public:
double x;
double y;
double z;
};

class PointBase
{
public:

double x;
double y;
double z;

PointBase operator+(const Vector &vec) const
{
PointBase b;
b.x=vec.x+this->x;
b.y=vec.y+this->y;
b.z=vec.z+this->z;
return b;

}
};

class Point:public PointBase
{
public:
PointBase operator+(const Point &point) const
{
PointBase b;
b.x=point.x+this->x;
b.y=point.y+this->y;
b.z=point.z+this->z;
return b;
}
Point(PointBase& base)
{
}
Point()
{
}
};

int main()
{
Point p;
Vector v;
p=p+v;
return 0;
}

PointBase operator+(const Point &point) const 隐藏了 PointBase operator+(const Vector &vec) const,为什么?我希望 2 个重载能正常工作:point+vectorpoint +point

最佳答案

Point中的operator+隐藏了继承自PointBase的那个。要使其可用,请使用

class  Point:public PointBase
{
public:
using PointBase::operator+; // <-- here

PointBase operator+(const Point &point) const

// rest as before

但是请注意,您将遇到的下一个问题是

p=p+v

尝试使用一个 operator=,它在左边有一个 Point,在右边有一个 PointBase,但它不存在。

派生类中的 operator+ 隐藏基类中的原因是 C++ 中名称查找的工作方式:编译器逐层向外(具体类 -> 基类 -> base 基类 -> ...,对于从成员函数调用的非成员函数,继续通过周围的命名空间1),直到找到匹配的名称,尝试应用它,如果失败不起作用。您可以在这段非编译代码中看到相同的机制:

void foo(char const *) { }

namespace bar {
void foo(int) { }

void baz() {
// does not compile: bar::foo hides ::foo
foo("hello");
}
}

对于您的类,编译器会在 Point 中查找,找到匹配的名称,尝试应用它,并在失败时发出警告。它不会继续在周围范围 (PointBase) 中查找,但如果它没有在 Point 中找到 operator+,它会继续查找.

1 这里有一个星号表示继承其他类模板的类模板,不同的机制在这里发挥作用。参见 Why do I have to access template base class members through the this pointer?有关详细信息,尽管在您的情况下这些都不起作用。

关于C++ 运算符重载或重新定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28656534/

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