C ++一个多态类,虚函数和性能转换

时间:2011-07-20 18:46:43

标签: c++ polymorphism downcast upcasting

我有以下课程:

class State
{
  protected:
    Vec3D accel;
    Vec3D gyro;
    Vec3D gps;
    float reward;
  public:
    boost::ptr_vector<Action> actions;
    ...
    virtual bool isTerm();
}

class guState : public State
{  
    float gps_stand_thres;
    float gps_down_thres;
  public:
    guState(Agent &A,ACTION_MODE &m);
    bool isTerm();
};

还有其他所有类都继承自State。他们之间的区别仅在于他们如何评价依赖于行为的isTerm()。 我宁愿不使用虚函数bur覆盖函数isTerm,如果不是因为有一些其他模板化的类被设计用于各种各样的状态派生类。 其中之一是政策:

template <class S>
class Policy
{ 
  protected:    
    float QValue;
    S *state;
    S *nextState;
  public:
    ...
    template <class P>
    void updateOptimal(boost::ptr_vector<P> &policies);
}

updateOptimal必须获取一个State派生类(取决于行为),从State * ptr向上转换为当前使用的S类型,以便搜索该状态的策略。现在,因为状态派生类是多态的,我认为这是正确的做法:

S *s = dynamic_cast<S *>(iter->getNextState());

其中iter是Actions的迭代器,每个动作的指针都为State *nextstate; action-&gt; nextstate设置在其他一点:

action->setNextState(dynamic_cast<State *>(state)); 

我可以模拟整个类Action,以避免使用State *nextstate;并使用S *nextstate;,但这需要在整个项目中进行大量更改。

阅读cplusplus.com上的演员教程我的理解是最好使用dynamic_cast,因为它在向上或向下投射之前进行了类型检查。 但是在下面的代码中,除了用于搜索之外,我没有对上升状态做任何事情:

P *temp_pol = var::findPolicy(policies,s);

其中findPolicy是:

template <class P, class S>
P* findPolicy(boost::ptr_vector<P> &policies,S *state);
  • 是否可以跳过安全检查,并使用静态演员?一世 已经尝试过,它会编译。
  • 是否可以完全跳过检查,然后进行reinterpret_cast? 我也尝试了它并编译。
  • 执行dynamic_cast会受到什么惩罚?我知道这很小 开销,但是有什么严重的吗?
  • 有没有办法从State * ptr上传到S-type * ptr而不使用 一个多态类(避免虚函数而且简单 覆盖它)?

1 个答案:

答案 0 :(得分:4)

static_castdynamic_cast之间的区别在于无效的static_cast是未定义的行为,而无效的dynamic_cast会导致空指针或bad_cast } -exception(如果你转换引用)。 dynamic_cast的惩罚是在运行时进行类型检查,并且由于RTTI而增加了代码大小。

所以,如果您确定演员表总是很好,那么您可以安全地使用static_cast。使用reinterpret_cast不会比static_cast提供任何性能提升,因此您不应在此处使用它。