我怀疑在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);
这个例子会发生什么?我们正在修改一个基础分支,就好像它是一个孩子......它如何与记忆相关?
使用此演员......是否像创建B的实例并复制A的值?
由于
答案 0 :(得分:6)
A* a;
这只是给你一个指向A
的指针。它并没有特别指出任何地方。它根本不指向A
或B
对象。代码是否有效取决于它所指向的对象的动态类型。
因此,您可能想了解两种情况。首先,这一个:
A* a = new A();
B* b = dynamic_cast<B*>(a);
b->SetVal(2);
这将为您提供未定义的行为,因为dynamic_cast
将返回空指针。当对象的动态类型实际上不是B
时,它返回空指针。在这种情况下,对象是A
。然后尝试使用b->SetVal(2)
取消引用空指针,这样就会得到未定义的行为。
A* a = new B();
B* b = dynamic_cast<B*>(a);
b->SetVal(2);
这样可以正常工作,因为该对象确实是一个B
对象。动态转换将成功,SetVal
调用将正常工作。
但是,请注意,要使其正常工作,A
必须是多态类型。要做到这一点,它必须至少有一个虚拟成员函数。
答案 1 :(得分:1)
这甚至不应该编译,因为类不是多态的,所以你不能使用dynamic_cast
。
如果确实如此,那将是未定义的行为。