2017-10-16 117 views
-1

繼承問題我只是無法環繞我的頭。我有三個班級,他們之間有父母關係。它們都具有功能calcForces()繼承:子代使用父虛函數而不是自己

class Object { 
public: 
    virtual void calcForces(); 
}; 


class Boat : public Object { 
public: 
    virtual void calcForces(); 
}; 


class Sailboat : public Boat { 
public: 
    void calcForces(Wind wind); 
}; 

現在我的問題是,有II作爲帆船創建了一個對象(和對象指針保存它),但是當我打電話calcForces()我結束了內部船:: calcForces(),而不是Sailboat :: calcForces()。我究竟做錯了什麼?

下面是我調用該函數:

(*this->object_ptr_arr[i]).calcForces(); //'object_ptr_arr' is of type 'Object**' 
+2

請顯示[MCVE]。 –

+2

您需要通過指針調用多態行爲。嘗試:'this-> object_ptr_arr [i] - > calcForces();' – Galik

+4

爲了避免這些問題,請參閱http://en.cppreference.com/w/cpp/language/override – stefaanv

回答

11

的覆蓋的聲明必須匹配。您的Sailboat::calcForces聲明採用不同的參數(一個Wind實例),因此不是覆蓋。

作爲@stefaanv和@skypjack的評論,您可以通過使用override函數說明符來避免此問題,該函數說明符在編譯時會捕獲錯誤。

+0

非常好的捕獲:) – fjardon

+0

我會提到'override'關鍵字,它的作用是在編譯時檢查它並避免錯誤。 – skypjack

+0

@skypjack完成! – acraig5075

2

如果你想在你的帆船calcForces()方法,你應該在那裏添加它。 目前你只需要在你的帆船calcForces(Wind wind)方法(和從Boat繼承了calcForces()

所以,當你不帶參數調用calcForces它將在繼承的方法結束。要解決此問題,請將其添加到Sailboat(如上所述)或使用類型變量調用它Wind

2

建議 - 船隻和帆船存在於環境中。船知道它是如何受環境影響的。

class Environment 
{ 
public: 
    Wind wind; 
}; 

class Object { 
public: 
    virtual void calcForces(Environment const&); 
}; 


class Boat : public Object { 
public: 
    virtual void calcForces(Environment const& env); // can ignore the wind 
}; 


class Sailboat : public Boat { 
public: 
    void calcForces(Environment const& env) override; // will use env.wind in calculation 
}; 

現在您可以修改環境並要求環境中的所有對象計算其力量。無論他們是船隻,帆船還是海豚。

+0

非常好的建議,並且因爲面向對象的方法而絕對可取。但是,如果他將來面臨類似的問題,那麼這不是很有用,因爲它沒有描述他做錯了什麼。 – Rafiwui