【发布时间】:2021-12-25 16:09:21
【问题描述】:
我有抽象类Currency 和几个子类,如FiatMoney 或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();
此时我当然有一个错误,该类货币没有成员调用com()。我怎样才能避免这种情况?
我如何才能访问仅在子类 FiatMoney 的对象中的函数 com()?
我可以在 FiatMoney 类中拥有方法而不事先将其声明为 Currency 类的 virtual 函数吗?
这是存储不同子类对象的正确方法吗?
【问题讨论】:
-
显示的代码表明您知道虚函数是什么,以及它们是如何工作的,这就是您如何做到这一点的。所以,你的问题不清楚?将其定义为另一个虚拟方法?
-
@SamVarshavchik 但我不想创建另一个虚拟方法,从那时起我需要在每个子类中声明它。我只希望在一个子类中使用这种特殊方法。
-
@DanielJankowski "从那以后我需要在每个子类中声明它" - 不,你不需要。您可以在基类中为其提供默认实现,并仅在您想要的一个派生类中覆盖它。只有纯虚拟(即抽象)方法需要在每个派生类中实现(如您的
to_String()和UpdateRatio()方法)。虚拟方法不必是抽象的。
标签: c++ inheritance vector abstract-class object-slicing