[英]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()
为B
的const
引用。 没有什么可以阻止您的:
const B& b = dynamic_cast<const B&>(getA());
旁注:我假设您问题中的getA
实现仅用于演示目的,但这是非常错误的。 一旦ap
超出范围(即getA
返回),它将破坏它指向的对象,因此您将返回一个悬空的引用,从而调用未定义的行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.