c ++在基class类型的向量中调用subclass方法
c++ Call subclass method in vector of base class type
我有摘要 class Currency
和几个子 class 像 FiatMoney
或 Crypto
。我想将 subclasses 的所有对象存储在一个向量中,同时可以访问仅在那些 subclasses.
中的方法
我的 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:
};
在那个 class 中,我想要这个 class 的额外方法叫做 com()
。最后我的主要功能是这样的:
vector<Currency*> Wallet;
Wallet.push_back(new FiatMoney("name", "shortname", 1.0, 1.0));
Wallet[0]->com();
此时我当然有一个错误,就是class货币没有会员调用com()
。我怎样才能避免这种情况?
我如何才能访问仅在 subclass FiatMoney 对象中的函数 com()?
我可以在 class FiatMoney 中使用方法,而无需事先将其声明为 Currency
class 的 virtual
函数吗?
这是存储不同子class对象的正确方法吗?
How can I get access to the function com() which is only in object of subclass FiatMoney?
您必须将 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();
Can I have method in class FiatMoney without previously declarate it as virtual function of Currency class?
从技术上讲是的,尽管有些人认为在处理多态 classes 时这不是一个好的设计选择。
Is this proper way of storing objects of different subclasses?
从技术上讲是的,尽管 Currency
应该有一个虚拟析构函数。您必须 delete
您 new
的对象,并且虚拟析构函数将允许您在 Currency*
指针上调用 delete
以调用派生的 class 析构函数而没有类型-投射指针。因此,您应该考虑存储智能指针,例如 std::unique_ptr
,而不是原始指针,以便自动为您调用 delete
。
我有摘要 class Currency
和几个子 class 像 FiatMoney
或 Crypto
。我想将 subclasses 的所有对象存储在一个向量中,同时可以访问仅在那些 subclasses.
我的 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:
};
在那个 class 中,我想要这个 class 的额外方法叫做 com()
。最后我的主要功能是这样的:
vector<Currency*> Wallet;
Wallet.push_back(new FiatMoney("name", "shortname", 1.0, 1.0));
Wallet[0]->com();
此时我当然有一个错误,就是class货币没有会员调用com()
。我怎样才能避免这种情况?
我如何才能访问仅在 subclass FiatMoney 对象中的函数 com()?
我可以在 class FiatMoney 中使用方法,而无需事先将其声明为 Currency
class 的 virtual
函数吗?
这是存储不同子class对象的正确方法吗?
How can I get access to the function com() which is only in object of subclass FiatMoney?
您必须将 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();
Can I have method in class FiatMoney without previously declarate it as virtual function of Currency class?
从技术上讲是的,尽管有些人认为在处理多态 classes 时这不是一个好的设计选择。
Is this proper way of storing objects of different subclasses?
从技术上讲是的,尽管 Currency
应该有一个虚拟析构函数。您必须 delete
您 new
的对象,并且虚拟析构函数将允许您在 Currency*
指针上调用 delete
以调用派生的 class 析构函数而没有类型-投射指针。因此,您应该考虑存储智能指针,例如 std::unique_ptr
,而不是原始指针,以便自动为您调用 delete
。