重载出错?

中才德创 2009-06-21 08:14:12
class Point2d
{
public:
Point2d(int x=0, int y=0)
: _x(x), _y(y)
{

}

int x(void)
{
return _x;
}
void x(int newX)
{
_x = newX;
}

int y(void)
{
return _y;
}
void y(int newY)
{
_y = newY;
}

virtual int z(void)
{
return 0;
}
virtual void z(int newZ)
{
}

virtual void operator +=(const Point2d& rhs)
{
_x += rhs._x;
_y += rhs._y;
}

protected:
int _x;
int _y;
};

class Point3d : public Point2d
{
public:
Point3d(int x=0, int y=0, int z=0)
: Point2d(x, y), _z(z)
{
}

virtual int z(void)
{
return _z;
}
virtual void z(int newZ)
{
_z = newZ;
}

virtual void operator +=(const Point2d& rhs)
{
Point2d::operator +=(rhs);
_z += rhs.z();
/* 报如下错
error C2663: 'Point2d::z' : 2 overloads have no legal conversion for 'this' pointer

问题一:
似乎出错在重载上,但不知为什么?
*/
}

protected:
int _z;
};

int _tmain(int argc, _TCHAR* argv[])
{
Point3d pt3_1(1, 2, 3);
Point3d pt3_2(4, 5, 6);

Point2d pt2_1(1, 2);
Point2d pt2_2(3, 4);

pt2_1 += pt2_2;
pt3_1 += pt3_2;
pt2_2 += pt3_2;

return 0;
}
...全文
55 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
中才德创 2009-06-21
  • 打赏
  • 举报
回复
现在可以了,问题是出在const上。
效率是降低了,这是书上的一个例子,它也是效率降低。
class Point2d
{
public:
Point2d(int x=0, int y=0)
: _x(x), _y(y)
{

}

int x(void) const
{
return _x;
}
void x(int newX)
{
_x = newX;
}

int y(void) const
{
return _y;
}
void y(int newY)
{
_y = newY;
}

virtual int z(void) const
{
return 0;
}
virtual void z(int newZ)
{
}

virtual void operator +=(const Point2d& rhs)
{
_x += rhs._x;
_y += rhs._y;
}

protected:
int _x;
int _y;
};

class Point3d : public Point2d
{
public:
Point3d(int x=0, int y=0, int z=0)
: Point2d(x, y), _z(z)
{
}

virtual int z(void) const
{
return _z;
}
virtual void z(int newZ)
{
_z = newZ;
}

virtual void operator +=(const Point2d& rhs)
{
Point2d::operator +=(rhs);
_z += rhs.z();
}

protected:
int _z;
};

int _tmain(int argc, _TCHAR* argv[])
{
Point3d pt3_1(1, 2, 3);
Point3d pt3_2(4, 5, 6);

Point2d pt2_1(1, 2);
Point2d pt2_2(3, 4);

pt2_1 += pt2_2;
pt3_1 += pt3_2;
pt2_2 += pt3_2;

return 0;
}
pengzhixi 2009-06-21
  • 打赏
  • 举报
回复
父类和子类的z()函数都要声明为const成员函数.
另外我觉得你成员函数设计存在很多问题.
象你这样的更本就不需要虚函数,你硬声明这么多虚函数,效率降低了不说,还容易出错
goodname 2009-06-21
  • 打赏
  • 举报
回复
看起来像是
virtual void operator +=(const Point2d& rhs)//const指针应该调用const函数,所以你在父类函数z() const这样看看
{
Point2d::operator +=(rhs);
_z += rhs.z();
}
中才德创 2009-06-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 mengde007 的回复:]
_z += rhs.z();
改为:
_z += Point3d::z();
[/Quote]半桶水,你有没有测验过,信口开河!
mengde007 2009-06-21
  • 打赏
  • 举报
回复
完全搞不懂Point2d也有z();看起来很费劲,也误导别人,完全不符合实际需要;
mengde007 2009-06-21
  • 打赏
  • 举报
回复
_z += rhs.z();
改为:
_z += Point3d::z();
tfzhy 2009-06-21
  • 打赏
  • 举报
回复
Point3d共有继承2d时,你重新实现了+=运算符重载,造成原重载自动隐藏,你在新的实现中当然无法再次使用2d的运算符重载了

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧