基于派生对象的static_cast是否始终选择大多数派生对象?

时间:2014-06-11 13:07:52

标签: c++ casting

在下面的仿真例子中,如果我static_cast到基类,当我调用setSnapshot()函数时,它仍会调用实际对象setSnapshot()。这就是我想要发生的事情。我的问题是,我可以一直依靠这个来工作吗?

在我正在处理的代码中,我们有这个类层次结构,在b类中有一些宏用于静态转换为b类型。这是从基类型向下转换,以便可以调用b中的专用函数。

#include <iostream>

class a {

};

class b: public a {
public:
  virtual void setSnapshot() { std::cout << "setting b snapshot\n"; }
};

class c : public b {
public:
  virtual void setSnapshot() { std::cout << "setting c snapshot\n"; }
};

int main() {
   a* o = new c;

   //specifically casting to b
   static_cast<b*>(o)->setSnapshot(); //prints setting c snapshot - what I want to happen

   delete o;
  return 0;
}

2 个答案:

答案 0 :(得分:4)

标题表明你误解了案件的作用。 new c创建一个c类型的对象,在它被破坏之前它将保持c

如果您要将其投射到a,则需要创建副本。但是你只是在施放指针。这不会影响原始对象。这仍然是c,这就是为什么你最终打电话给c::setSnapshot()

答案 1 :(得分:2)

只要一个函数在静态已知类型中是虚拟的,它的调用就会转到最派生的覆盖。

对于单继承,这可以理解为从基类链中搜索实现,从最派生类开始。

实际上,对于C ++,动态搜索没有完成,搜索的效果实现为简单的表查找。