2014-04-14 131 views
-2

我一直在四處尋找無果的解決方案,這一點,矢量繼承類

我有一些從一個基類繼承的類:

#ifndef navalVesselClass 
#define navalVesselClass 

#include <iostream> 
#include <string> 
class navalVessel 
{ 

public: 
    std::string Name_; 
    std::string Type_; 
    std::string OperatingCountry_; 
    std::string Built_; 
    std::string ServiceDate_; 
    bool Active_; 
    double Length_; 
    double Displacement_; 
    double Beam_; 
    double Draft_; 
    double Speed_; 
    double Range_; 


private: 

}; 

#endif 

,然後,例如一類繼承了:

#ifndef destroyerClass 
#define destroyerClass 

#include "surfaceCombatant.h" 
#include <string> 




class destroyer: public surfaceCombatant 
{ 
public: 
    enum class ArmamentPrimary { ANTIAIR, MISSILE }; 
    enum class ArmamentSecondary { TORPEDOS, MISSILE, ANTIAIR, ANTIGROUND };   
    ArmamentPrimary primaryArmament; 
    ArmamentSecondary secondaryArmament; 
private: 

}; 



#endif 

現在,當我想存儲在一個向量我創建一個向量如下

這些對象
std::vector<navalVessel *> shipFleet 

利用這一點,我可以二者,驅逐艦和其他艦艇存儲在該載體中三分球,然而,一旦我嘗試再次檢索他們,他們是典型的有navalVessel'的,當然,我不能訪問任何派生的類變量?例如主要的武器,我只能訪問基類的屬性。

謝謝。

+4

我認爲您正在尋找'dynamic_cast'? – crashmstr

+2

我認爲你正在尋找重構你的設計? – Shoe

+0

另外,我們可以閱讀代碼。你可以發佈代碼,而不是你的類的模式化版本嗎? – Shoe

回答

2

您的設計存在缺陷,如果未啓用RTTI並使用dynamic_cast,您將無法做到這一點。 但是這是無用的,因爲你的設計會保持不好或者變得更糟。

我建議閱讀一些OOP基礎知識,因爲您沒有完全理解基類和多態的含義。

基類的思想是提供一組通用的方法,這些方法根據具體類型的實現產生不同的值。

在你的場景中,你的基類應該提供一個成員來獲得可能的武器列表,每一個具體的實現都會返回他們的武器集合。沒有武器的船隻會返回空列表等。

但是,你對C++中抽象類的理解存在很大的缺陷。在基類中至少提供一個虛擬析構函數是絕對必要的。

+0

偉大的迴應,回去,並設置虛擬析構等。我會工作我的方式向後我想,並再次思考。 – Broak

+0

就這樣說,我得到它與動態演員工作(我原來的問題) – Broak

+0

@xBroak:更多的東西:這是一個好主意,不違反利斯科夫替代原則(http://en.wikipedia.org/wiki/Liskov_substitution_principle)。你的類應該依賴訪問器方法,而不是公開地公開成員。成員總是實施細節,不應該直接暴露在課堂上。 C++允許成員在''interface'類(基本上是一個抽象類)中成員,但是這通常導致非純粹的抽象類被用作接口對象,從而導致調用者和被調用者更高的耦合,因爲改變的內部實現具有外部效應。 – Samuel

0

將navalVessel *轉換爲實際類型的任何派生類的指針。使用dynamic_cast。

+0

試圖這樣做,命中如下:'必須有一個多態類鍵入'從我可以告訴,我需要一個'虛擬'功能,但不知道實施? – Broak

+1

@xBroak你的析構函數應該至少爲 – OMGtechy

+0

是的。順便說一句,如果沒有虛函數,爲什麼有一個基本指針向量?你想達到什麼目的? – Prabhu