将子shared_pointer转换为父shared_pointer c ++ 14

时间:2017-05-26 18:54:53

标签: casting c++14

将子共享指针向上转换为其父共享指针的正确方法是什么?我从苹果到水果的评论部分是我不清楚的地方。

class Fruit
{
};

class Apple : public Fruit
{
};

typedef std::shared_ptr<Fruit> FruitPtr;
typedef std::shared_ptr<Apple> ApplePtr;

int main()
{
    ApplePtr pApple = ApplePtr( new Apple() );

    FruitPtr pFruit = /* what is the proper cast using c++ 14 */
}

2 个答案:

答案 0 :(得分:1)

您可以简单地使用隐式上传:

FruitPtr pFruit = pApple

如果你要添加断点,你可以注意到在这一行之后强引用计数器增加到2(我假设你想要发生这种情况)。

无关评论: 更喜欢使用make_shared而不是自己调用new(阅读Difference in make_shared and normal shared_ptr in C++为什么)

答案 1 :(得分:1)

您可以使用std::static_pointer_cast,它完全符合您的要求:

class Fruit { };
class Apple : public Fruit { };

int main() {
  std::shared_ptr<Apple> pApple = std::make_shared<Apple>();
  std::shared_ptr<Fruit> pFruit = std::static_pointer_cast<Fruit>(pApple)
  return 0;
}

另外,我会避免直接构建shared_ptr。可以在this cppreference.com page上阅读这样做或使用make_shared的权衡。我也会像你一样避免类型定义ApplePtrFruitPtr因为读取你的代码的人可能会感到困惑,因为没有迹象表明它们是共享指针而不是原始指针。