对复制对象的引用的dynamic_cast失败

时间:2016-05-24 11:47:25

标签: c++ dynamic-cast

我有一个函数getA(),它返回base类型A的const引用,因为它是const,它不能dynamic_cast它,所以我制作const引用的副本然后创建对复制对象的引用,但是当我将dynamic_cast调用到复制对象的引用时,它会失败,代码如下所示:

struct A {
  int c = -1;
  virtual ~A() {}
};

struct B : A {int aa = 0;};

const A& getA(){
  std::unique_ptr<A> ap(new B);
  return *ap;
}


int main()
{
  const A& a = getA();
  A acopy = a;
  acopy.c = -2;
  A& acopyr = acopy;
  std::cout << a.c << std::endl;
  try{
    B& b = dynamic_cast<B&>(acopyr);
    std::cout << b.aa << std::endl;
  }catch(std::bad_cast b){
    std::cout << "bad" << std::endl;
  }
}

输出

-1
bad

1 个答案:

答案 0 :(得分:2)

acopy是动态(和静态)类型A的对象。请注意它是如何声明的:类型为A的对象。所以当然不能将其转换为B&

根据您的描述,我认为您只是想将getA()动态投射到对const的{​​{1}}引用。没有什么可以阻止你:

B

旁注:我认为您问题中的 const B& b = dynamic_cast<const B&>(getA()); 实现仅用于演示目的,但非常错误。一旦getA超出范围(即,ap返回),它将销毁它指向的对象,因此您将返回一个悬空引用,从而调用未定义的行为