我有一个函数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
答案 0 :(得分:2)
acopy
是动态(和静态)类型A
的对象。请注意它是如何声明的:类型为A
的对象。所以当然不能将其转换为B&
。
根据您的描述,我认为您只是想将getA()
动态投射到对const
的{{1}}引用。没有什么可以阻止你:
B
旁注:我认为您问题中的 const B& b = dynamic_cast<const B&>(getA());
实现仅用于演示目的,但非常错误。一旦getA
超出范围(即,ap
返回),它将销毁它指向的对象,因此您将返回一个悬空引用,从而调用未定义的行为