我对在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的指针。它没有特别指出。它根本不指向AB对象。代码是否有效取决于代码所指向的对象的动态类型。

因此,您可能需要了解两种情况。首先,这个:
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必须为多态类型。为此,它必须至少具有一个虚拟成员函数。

10-06 14:40