我对在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的值?
谢谢
最佳答案
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
必须为多态类型。为此,它必须至少具有一个虚拟成员函数。