我想为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+vector
和point +point
。
答案 0 :(得分:2)
operator+
中的Point
隐藏了从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+
隐藏基类中的void foo(char const *) { }
namespace bar {
void foo(int) { }
void baz() {
// does not compile: bar::foo hides ::foo
foo("hello");
}
}
的原因是名称查找在C ++中的工作方式:编译器向外扩展(具体类 - &gt;基类 - &gt;基础基类 - &gt; ...,并且对于从成员函数调用的非成员函数继续通过周围的名称空间 1 ),直到找到匹配的名称,尝试应用它,如果失败则失败不起作用。您可以在此非编译代码段中看到相同的机制:
Point
对于类,编译器会查找PointBase
,查找匹配的名称,尝试应用它,并在失败时进行投诉。它不会继续查看周围的范围(operator+
),但会继续查看是否在Point
中找不到{{1}}。
1 这里有继承其他类模板的类模板的星号,其中不同的机制发挥作用。有关详细信息,请参阅Why do I have to access template base class members through the this pointer?,但在您的情况下,这些都不起作用。