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

时间:2015-02-22 09:54:07

标签: c++ operator-overloading

我想为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

1 个答案:

答案 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?,但在您的情况下,这些都不起作用。