在下面的人工例子中,如果我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;
}
最佳答案
标题表明您误解了案例的作用。 new c
创建一个类型为 c
的对象,并且它将保持为 c
直到它被破坏。
如果您要将其转换为 a
,您需要创建一个拷贝。但你只是在转换指针。这不会影响原始对象。那仍然是 c
,这就是为什么您最终调用 c::setSnapshot()
的原因。
关于c++ - 派生对象的 static_cast 是否总是选择大多数派生对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24163783/