返回返回基本或派生CLSS指针的功能值

Return value of function that returns either base or derived clss pointer

本文关键字:返回 功能 指针 派生 CLSS      更新时间:2023-10-16

给定以下代码中显示的类的关系:

class Base
{
    virtual getValue() { return 0; }
};
class Derived: public Base
{
    getValue() override { return 1; }
};
class Another
{
    Base* makeClass( bool );
    void createVector();
};
Base* Another::makeClass( bool base )
{
    if( base )
    {
        return new Base();
    }
    else
    {
        return new Derived();
    }
}
void Another::createVector()
{
     std::vector<Base> vector;
     vector.emplace( *makeClass( false ) );
     std::cout << vector[0].getValue();
}

为什么它打印0而不是1?添加到向量时,它是否将Derived*转换为Base

"当添加到向量时,它是否将Derived*转换为Base?"是的。

vector.emplace( *makeClass( false ) );

*makeClass( false )将指针返回并将其切成 Base。此Base存储在vector

推荐阅读:什么是对象切片?

解决此问题,

 std::vector<Base *> vector; // but watch out for Cylons
 vector.emplace( makeClass( false ) );
 std::cout << vector[0]->getValue();

或更好的是,研究std::unique_ptr并使智能指针内存管理为您工作。