我有一个基类Vehicle
,我希望填充一个std::unordered_map
,其子类为Runnable
(Motorcycle
,Car
,Airplane
)这样我就可以遍历地图并连续调用静态方法Motorcycle::run()
,Car::run()
,Airplane::run()
。
我应该如何填充std::unordered_map
?
答案 0 :(得分:1)
有两种方法。
艰难的方式:
由于静态函数不是虚拟的,因此您必须存储Mororcyle
Car
,Airplane
和typedef boost::variant< Motorcycle, Car, Airplane > VRunnable; // variant
unordered_map<key_t, VRunnable> m;
。
unorderd_map
当您遍历Runnable
时,您可以识别对象的类型,并调用正确类型的静态成员。您可以通过使用一个访问者类来执行此操作,该访问者类定义了变量中覆盖类型的操作。
它有效,但考虑到你想做什么,这是非常乏味的。实际上,这里没有利用unordered_map<key_t, Runnable> m;
for (auto x: m)
f.second.vrun();
继承和多态的任何优势。
聪明的方式:
更简单的方法是让一个虚拟成员Runnable :: vrun()调用每个Runnable子类的approporiate static run()。然后你可以简单地遍历你的无序映射,并调用虚函数:然后该对象将调用正确的静态成员。
{{1}}
答案 1 :(得分:0)
在C ++中,您无法多态调用静态方法。但是,您可以调用常规方法并使 it 调用静态方法。
struct Runnable
{
virtual void run_me() = 0;
};
class Car : public Runnable
{
public:
virtual void run_me() { run(); }
static void run();
};