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
的对象。因此,当然不能将其转换为aB&
根据您的描述,我认为您只是想动态地将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
是aB
?您使用A acopy=A将其设置为A
@NathanOliver但是a
是B
,不是吗?@user3828398a
是,但是您将acopy
声明为a
。如果acopy
是A
,则它不再是B
。
const B& b = dynamic_cast<const B&>(getA());