unique_prts是否允许隐式转换其包含类型?

时间:2015-02-11 10:16:23

标签: c++ inheritance smart-pointers

有人可以解释为什么我的factory功能正确吗? unique_ptr默认情况下是否进行动态转换?为什么返回类型不必与factory函数类型相同?

#include <exception>
#include <iostream>
#include <memory>

struct Animal
{
  virtual void makeSound() { std::cout << "(...)" << std::endl; }
};

struct Cat : public Animal
{
  virtual void makeSound() { std::cout << "Meaw!" << std::endl; }
};

struct Dog: public Animal
{
  virtual void makeSound() { std::cout << "Woof!" << std::endl; }
};

struct ConfusedCat : public Cat
{
  virtual void makeSound() { std::cout << "Moooooh!" << std::endl; }
};

// Why is this factory function allowed like this?
std::unique_ptr<Animal> factory(const int i)
{
  if (i == 1)
    return std::unique_ptr<Cat>(new Cat());
  else if (i == 2)
    return std::unique_ptr<ConfusedCat>(new ConfusedCat());
  else if (i == 3)
    return std::unique_ptr<Dog>(new Dog());
  else
    return std::unique_ptr<Animal>(new Animal());
}

int main()
{
  try
  {
    auto animal0 = factory(0);
    auto animal1 = factory(1);
    auto animal2 = factory(2);
    auto animal3 = factory(3);

    animal0->makeSound();
    animal1->makeSound();
    animal2->makeSound();
    animal3->makeSound();
  }
  catch ( std::exception &e )
  {
    std::cout << e.what() << std::endl;
    return 1;
  }

  return 0;
}

1 个答案:

答案 0 :(得分:4)

在C ++派生到公共基指针转换是隐式的,不需要强制转换。

对于所有标准和提升智能指针也是如此。

请参阅std::unique_ptr::unique_ptr上的重载6:

  

的std ::的unique_ptr&LT;衍生GT;可隐式转换为std :: unique_ptr&lt; Base&gt;通过过载(6)