C :模板类别的唯一_ptr多态性,该类别从非模板基类得出

C++: unique_ptr polymorphism for template classes derived from a non-template base class

本文关键字:基类 唯一 ptr 多态性      更新时间:2023-10-16

我有以下类:

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

,假设我对此类有唯一的_ptr,aka:

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;
}

出于争论的缘故,假设我有一种工厂方法,可以为某些新实例创建唯一的_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,这会导致编译错误(说基本没有Hello()方法),因为看来存储在unique_ptr中的实际实例是基础,而不是派生的。

基于我的理解(至少没有派生未被模板),这不是一个问题。这里发生了什么?

您功能make_class返回 BasePtr

auto make_class(const t&amp; x) -> baseptr

然后在您的main功能中说:

auto ptr = make_class(5);

也就是说,ptrBasePtr。该函数不知道指针实际上指向派生类。因此,没有hello()功能可以被调用。