C ++:从非模板基类派生的模板类的unique_ptr多态性

时间:2018-12-17 12:23:49

标签: c++ c++11 templates

我有以下课程:

class Base {
public:
    Base() = default;
    virtual ~Base() {};
}

而且,假设我对此类有一个unique_ptr:

using BasePtr = std::unique_ptr<Base>;

现在,让我们假设我有一个从基类继承的模板类。

template <typename T>
class Derived : public Base {
public:
      Derived() = default;
      Derived(const T x) : some_variable(x) {};
      ~Derived() override {};
       void hello() { std::cout << some_variable << std::endl; }
 private:
       T some_variable;
}

为了论证,假设我有一个工厂方法,该方法为一些新实例创建一个unique_ptr:

template <typename T>
auto make_class(const T& x) -> BasePtr {
    return std::unique_ptr<Derived<T> >(new Derived<T>(x));
}

如果我尝试构建它:

int main() {
    auto ptr = make_class<int>(5);
    if (ptr) {
         ptr->hello();
    }
    return 0;
}

在C ++ 11中,这会导致编译错误(说Base没有hello()方法),因为似乎存储在unique_ptr中的实际实例是Base,而不是Derived。

根据我的理解(至少如果未对Derived进行模板化),这应该不是问题。这是怎么回事?

1 个答案:

答案 0 :(得分:0)

函数make_class返回一个BasePtr

  

自动make_class(const T&x)-> BasePtr

然后在您的main函数中说:

  

auto ptr = make_class(5);

,即ptrBasePtr。该函数无法知道指针实际上指向派生类。因此,没有hello()函数可以被调用。