2

我对在 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 的值?

谢谢

4

2 回答 2

6
A* a;

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

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

A* a = new A();
B* b = dynamic_cast<B*>(a);
b->SetVal(2);

这会给你未定义的行为,因为这dynamic_cast将返回一个空指针。当对象的动态类型确实不是 a 时,它返回一个空指针B。在这种情况下,对象是一个A. 然后,您尝试使用 取消引用空指针b->SetVal(2),因此您会得到未定义的行为。

A* a = new B();
B* b = dynamic_cast<B*>(a);
b->SetVal(2);

这将正常工作,因为该对象确实是一个B对象。动态转换将成功,并且SetVal调用将正常工作。

但是,请注意,要使其正常工作,A必须是多态类型。要做到这一点,它必须至少有一个虚拟成员函数。

于 2013-05-03T14:34:18.780 回答
1

那甚至不应该编译,因为这些类不是多态的,所以你不能使用dynamic_cast.

如果是这样,那将是未定义的行为。

于 2013-05-03T14:35:38.503 回答