2011-10-14 118 views
1

我現在有點卡住了。我有一個名爲BaseBond的基類。 ZeroCouponBond和CouponBond從該類繼承。我正在創建一個包含兩種債券的數組。這裏是我的代碼:C++ - 基類數組的基本錯誤

... 
BaseBond port[12]; 

for (int i=0; i < recordCount; i++) 
{ 
    if (bonds[i].CouponRate == 0.0) 
     port[i] = new ZeroCouponBond(bonds[i]); 
    else 
     port[i] = new CouponBond(bonds[i]); 
} 

這裏是我得到的錯誤: 錯誤:不對應的「運營商=」在「口[I]

我知道這可能是一個簡單的解決,有當我可以在一個數組中聲明對象時,我會做些什麼,但是我對C++來說比較新,並且不知道所有的規則。

在此先感謝您的幫助!

回答

3

你需要做到這一點使用指針:

更改聲明如下:

BaseBond *port[12]; 

在你的原代碼,你想一個指針賦給BaseBond。所以它不會編譯。

此外,當你像這樣使用繼承時,你必須使用指針來防止對象切片。

+0

謝謝神祕! 最後一個問題。現在說要訪問CouponBond類的方法,我該如何解決這個問題?我知道陣列端口現在是一個BaseBonds數組。我必須首先將它作爲CouponBond來訪問它的方法嗎?這個代碼有什麼問題: port [i] = new CouponBond(bonds [i]); printf(「P:%f」,((CouponBond)port [i]) - > getPrice()); – CHawk

+1

如果該方法特定於「CouponBond」類,那麼您無法真正做到這一點。所以你必須施展它 - 儘管在這一點上,你必須更仔細地考慮你是否正確設計了它。理想情況下,該方法位於BaseBond類中,並由每個子類覆蓋。 – Mysticial

+1

我剛剛看到您的評論編輯。在這種情況下,您應該在'BaseBond'類中定義'getPrice'方法並使其變爲虛擬。 (這是有道理的,因爲'getPrice'適用於所有的「債券」)然後你可以用一個特定於'CouponBond'的版本覆蓋它。 – Mysticial