gpt4 book ai didi

c++ - 对复制对象的引用的 dynamic_cast 失败

转载 作者:行者123 更新时间:2023-11-30 03:41:20 25 4
gpt4 key购买 nike

我有一个函数 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() 转换为对 Bconst 引用。没有什么能阻止你这样做:

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

旁注:我假设您问题中的 getA 实现只是为了演示目的,但它非常是错误的。一旦 ap 超出范围(即,一旦 getA 返回),它就会销毁它指向的对象,因此您将返回一个悬垂的对象引用并因此调用未定义的行为。

关于c++ - 对复制对象的引用的 dynamic_cast 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37412660/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com