c++ - 派生对象的 static_cast 是否总是选择大多数派生对象?

标签 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;
}

最佳答案

标题表明您误解了案例的作用。 new c 创建一个类型为 c 的对象,并且它将保持为 c 直到它被破坏。

如果您要将其转换为 a,您需要创建一个拷贝。但你只是在转换指针。这不会影响原始对象。那仍然是 c,这就是为什么您最终调用 c::setSnapshot() 的原因。

关于c++ - 派生对象的 static_cast 是否总是选择大多数派生对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24163783/

相关文章:

c++ - 在可变函数调用中执行一次语句

不能取消引用变量所以函数满足

c - 如何将整数转换为 void 指针?

c++ - 服务器多播 - MFC CSocket - C++ - 如何?

C++如何在不使用排序的情况下打印大小为n的数组中的最小数字

actionscript-3 - AS3 : cast or "as"?

c# - 当类型仅在运行时已知时,如何在有限制的情况下调用泛型

在 C 中转换 void 指针

c++ - 在 operator<< 中将 union 作为参数传递时出错

java - 高级语言(例如Java)和汇编语言之间的关系?