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的值?
谢谢
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必须是多态类型.为此,它必须至少有一个虚拟成员函数.