衍生课程'继承的方法不起作用

时间:2014-05-20 18:23:15

标签: c++ class inheritance methods

基类:

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()时,它有值。

这太奇怪了......

2 个答案:

答案 0 :(得分:0)

据我所知,getLength方法总是返回基类的成员length的内容,它不能由setLength在派生类中编写,因为它是私有的在基类中。从派生类中删除length并在基类中生成length protected应该可以解决问题;但是我很惊讶问题中的代码在语法上是正确的。

答案 1 :(得分:0)

Line3D中,对getLength()的调用是对超类继承方法的调用,该方法依次使用其本地&#34; (到Line2Dlength属性。 拨打setLength()是对Line3D中覆盖的方法的调用,而Line3D又使用其本地&#34; (Line3D)长度属性。 因此,当您调用getLength()时,您将拥有超级类length的值,该值可能已初始化为零。 通常,在子类中定义具有相同名称的属性是一种非常糟糕的设计。因此,请删除您的Line3D::length属性,并仅使用getLength()setLength()方法。 我建议您添加一个参数,例如setLength(int v),并将setLength()的调用替换为具有适当值的新调用(您可以使用私有的distance()方法进行计算)