通过函数传递指针后,我该如何向下变换指针?

时间:2019-06-25 13:04:57

标签: c++ function polymorphism downcast

我创建了一个函数,该函数返回指向在func中创建的派生对象的基本指针。 似乎不起作用!好像派生的数据丢失了,并且指针指向基础对象...

有一个Request类,它是基类, 还有类loginRequest-派生Request。为了检查对象的类型,我打印了对象的名称(typeid(* r).name())。 在func()内部,打印输出结果是“ loginRequest”,这很好,因为这是指向对象。 (看代码) 但是返回该指针后,当我再次打印它的类型时,结果是“请求”。你们能帮我吗?为什么返回的指针会丢失派生数据?


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; 
}

2 个答案:

答案 0 :(得分:3)

您将返回一个指针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

答案 1 :(得分:1)

您正在创建本地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; 
}

还使用智能指针而不是原始指针。