从函数返回时如何从shared_ptr <derived>转换为shared_ptr <base />?</derived>

时间:2014-08-05 15:58:34

标签: c++

假设我们有一个名为Vehicle的抽象类。一堆类将继承自Vehicle,例如Boat,Car,Truck等。

我想创建一个函数,它给我一个指向车辆的指针给定我传入的某些参数。我不需要访问底层的Vehicle。到目前为止我有这样的事情:

boost::shared_ptr<Vehicle> create_vehicle(Environment e, Cost c) {
    if (e.is_water()) {
        boost::shared_ptr<Boat> boat(new Boat());
        boat->set_location("USA");
        boat->set_environment(e);

        ...

        return boat; // How should I return the shared pointer here?
                     // I get an error for doing this 
                     // "Vehicle is an inaccessible base of boat"

    } else if (e.is_land()) {
        ...
    }
}

当函数的返回值是shared_ptr时,如何返回派生的shared_ptr?铸造是必要的还是没有铸造的方法?我想我也可以按值返回派生类,但是当我退回时我不想再制作车辆的副本。

3 个答案:

答案 0 :(得分:5)

从您的错误消息出现,您在VehicleBoat之间使用了私有或受保护的继承,而非公开。

答案 1 :(得分:1)

您需要使用static_pointer_cast - 它与shared_pointers的static_cast相当。看http://www.boost.org/doc/libs/1_55_0/libs/smart_ptr/shared_ptr.htm#functions

答案 2 :(得分:0)

您可以创建一个到车辆的shared_ptr并使用它

boost::shared_ptr<Vehicle> create_vehicle(Environment e, Cost c) 
{
    boost::shared_ptr<Vehicle> vehicle;
    if (e.is_water()) {
        Boat *boat = new Boat();
        boat->set_location("USA");
        boat->set_environment(e);

        vehicle.reset(boat); // Assign the pointer to the result

    } else if (e.is_land()) {
        ...
    }
    return vehicle;
}