C++ 对复制对象引用的动态\u强制转换失败

C++ 对复制对象引用的动态\u强制转换失败,c++,dynamic-cast,C++,Dynamic Cast,我有一个函数getA(),它返回一个base类型a的常量引用,因为它是常量,它不能dynamic\u cast它,所以我复制了一个常量引用,然后创建了一个复制对象的引用,但是当我调用复制对象的引用dynamic\u cast时,如果失败,代码如下所示: struct A { int c = -1; virtual ~A() {} }; struct B : A {int aa = 0;}; const A& getA(){ std::unique_ptr<A>

我有一个函数
getA()
,它返回一个
base
类型
a
的常量引用,因为它是常量,它不能
dynamic\u cast
它,所以我复制了一个常量引用,然后创建了一个复制对象的引用,但是当我调用复制对象的引用
dynamic\u 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;
  }
}

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

根据您的描述,我认为您只是想动态地将
getA()
转换为
const
引用到
B
。没有什么能阻止你这么做:

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


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

难道
dynamic\u cast(a)
不就是您所需要的吗?编辑:另外,
getA()
会返回一个悬空引用,因为
ap
会破坏它在右括号处的指针。为什么你认为
acopy
是a
B
?您使用
A acopy=A将其设置为
A
@NathanOliver但是
a
B
,不是吗?@user3828398
a
是,但是您将
acopy
声明为
a
。如果
acopy
A
,则它不再是
B
 const B& b = dynamic_cast<const B&>(getA());