繁体   English   中英

对复制对象的引用dynamic_cast失败

[英]dynamic_cast of a reference to copied object fails

我有一个函数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

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

根据您的描述,我认为您只是想将getA()动态getA()Bconst引用。 没有什么可以阻止您的:

 const B& b = dynamic_cast<const B&>(getA());

旁注:我假设您问题中的getA实现仅用于演示目的,但这是非常错误的。 一旦ap超出范围(即getA返回),它将破坏它指向的对象,因此您将返回一个悬空的引用,从而调用未定义的行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM