[英]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
應解決此問題; 但是,令我驚訝的是,該問題中的代碼在語法上是正確的。
在Line3D
對getLength()
的調用是對超類繼承方法的調用,該方法又使用其“本地”(對Line2D
) length
屬性進行播放。 對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.