簡體   English   中英

派生類的繼承方法不起作用

[英]Derived class' inherited method not working

基類:

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()時,它卻具有值。

太奇怪了...

據我了解, getLength方法始終返回基類成員length的內容,該值不能由setLength在派生類中編寫,因為它在基類中是私有的。 從派生類中刪除length並在基類中protected length應解決此問題; 但是,令我驚訝的是,該問題中的代碼在語法上是正確的。

Line3DgetLength()的調用是對超類繼承方法的調用,該方法又使用其“本地”(對Line2Dlength屬性進行播放。 setLength()的調用是對Line3D中重寫的方法的調用,而Line3D中的重寫方法又使用其“本地”( Line3D )length屬性Line3D 因此,當您調用getLength()您將擁有可能已初始化為零的超類length值。 通常,在子類中定義具有相同名稱的屬性是非常糟糕的設計。 因此,刪除Line3D::length屬性,僅使用getLength()setLength()方法。 我可以建議您添加諸如setLength(int v)類的參數,並用具有適當值的新值替換對setLength()調用(您可以使用私有的distance()方法進行計算)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM