我有抽象類Currency和幾個子類,比如FiatMoneyor Crypto。我想將子類的所有物件存盤在一個向量中,同時可以訪問僅在這些子類中的方法。
我的 Currency.h 檔案如下所示:
class Currency
{
public:
virtual void to_String() = 0;
float GetAmount();
string GetShortname();
void AddAmount(float);
void RemoveAmount(float);
virtual void UpdateRatio() =0;
virtual float trade(bool, float, float, float, string) = 0;
protected:
string *name, *shortname;
float *amount, *exchange_ratio;
};
和我的 FiatMoney.h 檔案:
class FiatMoney : public Currency
{
public:
FiatMoney(string, string, float, float);
~FiatMoney();
void to_String();
void UpdateRatio();
float trade(bool, float, float, float, string);
void com();
private:
};
在那個班級中,我想有這個班級的附加方法,稱為com(). 最后我的主要功能是這樣的:
vector<Currency*> Wallet;
Wallet.push_back(new FiatMoney("name", "shortname", 1.0, 1.0));
Wallet[0]->com();
此時我當然有一個錯誤,那個類 Currency 沒有成員 call com()。我怎樣才能避免這種情況?
如何訪問僅在子類 FiatMoney 的物件中的函式 com()?
我可以在 FiatMoney 類中有方法而不事先將其宣告為類的virtual函式Currency嗎?
這是存盤不同子類物件的正確方法嗎?
uj5u.com熱心網友回復:
如何訪問僅在子類 FiatMoney 的物件中的函式 com()?
您必須將Currency*指標型別轉換為FiatMoney*指標,但只有在指標實際指向有效FiatMoney物件時才能這樣做。
當你知道的Currency*指標在指向FiatMoney的物件,你可以使用static_cast在編譯時間,例如:
static_cast<FiatMoney*>(Wallet[0])->com();
否則,dynamic_cast在運行時使用來測驗所指向的物件的型別:
FiatMoney *fm = dynamic_cast<FiatMoney*>(Wallet[0]);
if (fm) fm->com();
我可以在 FiatMoney 類中有方法而不事先將其宣告為 Currency 類的虛函式嗎?
從技術上講是的,盡管有些人會認為在處理多型類時這不是一個好的設計選擇。
這是存盤不同子類物件的正確方法嗎?
從技術上講是的,雖然Currency應該有一個虛擬解構式。你必須delete對你的物件new和虛擬解構式將允許您撥打delete一個Currency*指標呼叫派生類的解構式沒有型別轉換的指標。因此,您應該考慮存盤智能指標,例如std::unique_ptr, 而不是原始指標,以便delete為您自動呼叫。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/362179.html
下一篇:回傳另一個泛型型別的泛型
