派生类的继承方法不起作用

Derived class' inherited method not working

本文关键字:方法 不起作用 继承 派生      更新时间:2023-10-16

基类:

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

I cout some消息在getLength()中,它表明程序确实调用了getLength()。然而,返回值总是0.000。为什么会出错呢?

在我的代码中没有错误,但是派生类只是无法通过getLength()获得任何值。当我用基类对象调用getLength()时,它有值。

根据我的理解,getLength方法总是返回基类成员length的内容,setLength不能在派生类中编写,因为它在基类中是私有的。将length从派生类中移除并使length在基类中成为protected应该可以解决这个问题;然而,令我惊讶的是,问题中的代码在语法上是正确的。

Line3D中,对getLength()的调用是对超类继承方法的调用,该方法反过来又使用其"本地"(对Line2D) length属性。对setLength()的调用是对Line3D中覆盖的方法的调用,该方法反过来使用其"本地"(Line3D)长度属性。所以当你调用getLength()时,你会得到超类length的值,它可能被初始化为0。一般来说,在子类中定义具有相同名称的属性是一个非常糟糕的设计。因此,删除您的Line3D::length属性,只使用getLength()setLength()方法。我可以建议您添加一个参数,如setLength(int v),并用一个具有适当值的新参数替换对setLength()的调用(您可以使用一个私有的有用的distance()方法来进行计算)