向下转换类c ++

Fri*_*n3L 2 c++ inheritance downcast

我怀疑在C++中向下转换对象.

这是一个例子:

class A { }
class B : public A { 
  public:
    void SetVal(int i) { _v = i; }
  private:
    int _v;
}

A* a = new A();
B* b = dynamic_cast<B*>(a);
b->SetVal(2);
Run Code Online (Sandbox Code Playgroud)

这个例子会发生什么?我们正在修改一个基础分支,就好像它是一个孩子......它如何与记忆相关?

使用此演员......是否像创建B的实例并复制A的值?

谢谢

Jos*_*eld 6

A* a;
Run Code Online (Sandbox Code Playgroud)

这只是给你一个指针A.它并没有特别指出任何地方.它根本不指向一个A或一个B对象.代码是否有效取决于它所指向的对象的动态类型.

因此,您可能想要了解两种情况.首先,这一个:

A* a = new A();
B* b = dynamic_cast<B*>(a);
b->SetVal(2);
Run Code Online (Sandbox Code Playgroud)

这将为您提供未定义的行为,因为dynamic_cast它将返回空指针.当对象的动态类型实际上不是a时,它返回一个空指针B.在这种情况下,对象是A.然后尝试取消引用空指针b->SetVal(2),以便获得未定义的行为.

A* a = new B();
B* b = dynamic_cast<B*>(a);
b->SetVal(2);
Run Code Online (Sandbox Code Playgroud)

这样可以正常工作,因为对象确实是一个B对象.动态演员表会成功,SetVal电话会很好.

但是,请注意,为此工作,A必须是多态类型.为此,它必须至少有一个虚拟成员函数.