向下转换类c ++

时间:2013-05-03 14:31:24

标签: 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);

这个例子会发生什么?我们正在修改一个基础分支,就好像它是一个孩子......它如何与记忆相关?

使用此演员......是否像创建B的实例并复制A的值?

由于

2 个答案:

答案 0 :(得分:6)

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必须是多态类型。要做到这一点,它必须至少有一个虚拟成员函数。

答案 1 :(得分:1)

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

如果确实如此,那将是未定义的行为。