从基础静态转换为派生后找不到成员函数

时间:2019-09-27 04:50:23

标签: c++ inheritance polymorphism c++14

我正在尝试构建一个名为“ step”的函数,该函数需要一个基类指针并执行一些操作。目前,我正在使用虚拟基类以启用公共接口。

#include <iostream>

using namespace std;

class gym_action //dummy base
{
public:
    virtual ~gym_action(){}
};

template<typename T>
class action_helper : public gym_action
{
    public :
        action_helper(T a) : action_item(a){}
        T get_action() {return action_item;}

    private:
       T action_item;

};

void step(gym_action* act)
{
    act = dynamic_cast<action_helper<int>*>(act);
    cout<<act->get_action()<<endl;
}

int main()
{

    action_helper<int> a(2);
//I will have more action_helper instansiations, like action_helper<Eigen::VectorXf> etc
    cout<<a.get_action()<<endl;
    step(&a);

}

此代码失败,因为gym_class没有成员函数get_action。显然,这样做的原因是基类中没有虚函数get_action

但是,我该如何定义呢?我目前无法理解的原因是每个模板化的get_action函数都返回不同的类型T。一种可能的方式是我在基类中提前定义所有可能的重载,但这似乎是一个糟糕的设计。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

即使在dynamic_cast之后,变量act仍然是类型gym_action*。因此,您可能无法在其上调用派生类成员函数。

使用新变量。

auto temp = dynamic_cast<action_helper<int>*>(act);
if ( temp != nullptr )
{
   cout << temp->get_action() << endl;
}