通过函数传递指针后如何向下转换指针?
How can I downcast a pointer after passing it through a function?
我创建了一个函数,其中 returns 一个指向在函数中创建的派生对象的基指针。
好像不行啊!好像派生数据丢失了,指针指向一个基础对象...
有class个请求,是基础class,
还有 class loginRequest - 它派生了 Request。为了检查对象的类型,我打印了对象的名称 (typeid(*r).name())。
在 func() 内部,打印输出结果是 "loginRequest",这很好,因为这是指向的对象。 (看代码)
但是在返回这个指针之后,当我再次打印它的类型时,结果是 "Request"。你们能帮帮我吗?为什么返回的指针丢失派生数据?
Request * r = new Request();
r = func(); // r is now supposed to point the LoginRequest object.
std::cout<< typeid(*r).name() <<std::endl; //print the type of OBJECT
//func
Request * func()
{
Request * r;
LoginRequest l = LoginRequest();
r = &l;
std::cout<< typeid(*r).name() <<std::endl; //print the type of OBJECT
return r;
}
您正在创建本地 LoginRequest
对象:
LoginRequest l = LoginRequest();
获取该地址:
r = &l;
并返回:
return r;
但是 l
在下一行超出了范围:
}
相反,您想在堆上创建它:
Request * func()
{
Request * r;
LoginRequest* l = new LoginRequest();
r = l;
std::cout<< typeid(*r).name() <<std::endl; //print the type of OBJECT
return r;
}
也使用智能指针而不是原始指针。
您正在返回指向对象 l
的指针,该对象具有自动存储持续时间。
取消引用返回的指针具有未定义的行为。
您需要使用 new
动态创建该对象,并消除因在函数外误用 new
而导致的内存泄漏:
Request* func()
{
Request* r = new LoginRequest();
std::cout<< typeid(*r).name() <<std::endl; //print the type of OBJECT
return r;
}
// ...
Request * r = func();
std::cout << typeid(*r).name() << std::endl; //print the type of OBJECT
我创建了一个函数,其中 returns 一个指向在函数中创建的派生对象的基指针。 好像不行啊!好像派生数据丢失了,指针指向一个基础对象...
有class个请求,是基础class, 还有 class loginRequest - 它派生了 Request。为了检查对象的类型,我打印了对象的名称 (typeid(*r).name())。 在 func() 内部,打印输出结果是 "loginRequest",这很好,因为这是指向的对象。 (看代码) 但是在返回这个指针之后,当我再次打印它的类型时,结果是 "Request"。你们能帮帮我吗?为什么返回的指针丢失派生数据?
Request * r = new Request();
r = func(); // r is now supposed to point the LoginRequest object.
std::cout<< typeid(*r).name() <<std::endl; //print the type of OBJECT
//func
Request * func()
{
Request * r;
LoginRequest l = LoginRequest();
r = &l;
std::cout<< typeid(*r).name() <<std::endl; //print the type of OBJECT
return r;
}
您正在创建本地 LoginRequest
对象:
LoginRequest l = LoginRequest();
获取该地址:
r = &l;
并返回:
return r;
但是 l
在下一行超出了范围:
}
相反,您想在堆上创建它:
Request * func()
{
Request * r;
LoginRequest* l = new LoginRequest();
r = l;
std::cout<< typeid(*r).name() <<std::endl; //print the type of OBJECT
return r;
}
也使用智能指针而不是原始指针。
您正在返回指向对象 l
的指针,该对象具有自动存储持续时间。
取消引用返回的指针具有未定义的行为。
您需要使用 new
动态创建该对象,并消除因在函数外误用 new
而导致的内存泄漏:
Request* func()
{
Request* r = new LoginRequest();
std::cout<< typeid(*r).name() <<std::endl; //print the type of OBJECT
return r;
}
// ...
Request * r = func();
std::cout << typeid(*r).name() << std::endl; //print the type of OBJECT