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

Cow*_*Zow 3 c++

假设我们有一个名为Vehicle的抽象类.一堆类将从车辆继承,如船,汽车,卡车等.

我想创建一个函数,它给我一个指向车辆的指针,给出我传入的某些参数.我不需要访问底层的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()) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*k B 5

从您的错误消息中可以看出,您在public 之间使用了private或protected Vehicle,Boat而不是public.