在下面的仿真例子中,如果我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;
}
答案 0 :(得分:4)
标题表明你误解了案件的作用。 new c
创建一个c
类型的对象,在它被破坏之前它将保持c
。
如果您要将其投射到a
,则需要创建副本。但是你只是在施放指针。这不会影响原始对象。这仍然是c
,这就是为什么你最终打电话给c::setSnapshot()
。
答案 1 :(得分:2)
只要一个函数在静态已知类型中是虚拟的,它的调用就会转到最派生的覆盖。
对于单继承,这可以理解为从基类链中搜索实现,从最派生类开始。
实际上,对于C ++,动态搜索没有完成,搜索的效果实现为简单的表查找。