基类:
class Line2D
{
friend ostream& operator<< (ostream&, const Line2D&);
private:
Point2D pt1;
Point2D pt2;
double length;
public:
Line2D () {pt1 = Point2D(); pt2 = Point2D(); length = 0.0;}
Line2D (Point2D ptA, Point2D ptB) {pt1=ptA; pt2=ptB; setLength();}
void setLength();
void setPt1 (Point2D);
void setPt2 (Point2D);
Point2D getPt1 () const;
Point2D getPt2 () const;
double getLength() const; //Inherited to sub-class, but not working in sub-class
};
double Line2D::getLength () const
{
return length;
}
void Line2D::setLength()
{
length = sqrt((pt1.getX() - pt2.getX())*(pt1.getX() - pt2.getX()) + (pt1.getY() - pt2.getY())*(pt1.getY() - pt2.getY()));
}
派生类:
class Line3D : public Line2D
{
friend ostream& operator<< (ostream&, const Line3D&);
private:
Point3D pt1;
Point3D pt2;
double length;
public:
Line3D (Point3D ptA, Point3D ptB) {pt1=ptA; pt2=ptB; setLength();}
void setLength();
void setPt1 (Point3D);
void setPt2 (Point3D);
Point3D getPt1 () const;
Point3D getPt2 () const;
};
void Line3D::setLength()
{
length = sqrt((pt1.getX() - pt2.getX())*(pt1.getX() - pt2.getX()) + (pt1.getY() - pt2.getY())*(pt1.getY() - pt2.getY()) + (pt1.getZ() - pt2.getZ())*(pt1.getZ() - pt2.getZ()));
}
我有2节课。派生类从其基类继承方法getLength()
。但是,当我通过Line3D对象(派生类'对象)调用getLength()
时,返回的值始终为0.000
。
我cout
getLength()
中的一些消息,它表明该程序确实调用了getLength()。但是,返回的值始终为0.000
。为什么可能出错?
我的代码中没有错误,但派生类无法通过getLength()
获取任何值。当我用基类对象调用getLength()
时,它有值。
这太奇怪了......
答案 0 :(得分:0)
据我所知,getLength
方法总是返回基类的成员length
的内容,它不能由setLength
在派生类中编写,因为它是私有的在基类中。从派生类中删除length
并在基类中生成length
protected
应该可以解决问题;但是我很惊讶问题中的代码在语法上是正确的。
答案 1 :(得分:0)
在Line3D
中,对getLength()
的调用是对超类继承方法的调用,该方法依次使用其本地&#34; (到Line2D
)length
属性。
拨打setLength()
是对Line3D中覆盖的方法的调用,而Line3D又使用其本地&#34; (Line3D
)长度属性。
因此,当您调用getLength()
时,您将拥有超级类length
的值,该值可能已初始化为零。
通常,在子类中定义具有相同名称的属性是一种非常糟糕的设计。因此,请删除您的Line3D::length
属性,并仅使用getLength()
和setLength()
方法。
我建议您添加一个参数,例如setLength(int v)
,并将setLength()
的调用替换为具有适当值的新调用(您可以使用私有的distance()
方法进行计算)