C :模板类别的唯一_ptr多态性,该类别从非模板基类得出
C++: unique_ptr polymorphism for template classes derived from a non-template base class
我有以下类:
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);
也就是说,ptr
是BasePtr
。该函数不知道指针实际上指向派生类。因此,没有hello()
功能可以被调用。
相关文章:
- std::具有相同基类的类的变体
- 是否可以初始化不可复制类型的成员变量(或基类)
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 基类中的函数名称解析
- C++初始化基类
- 如何通过派生类函数更改基类中的向量
- 如何定义一个纯抽象基类
- 如何使用基类指针引用派生类成员
- 为什么允许dynamic_cast到非唯一的基类类型?
- 指向基类的唯一指针
- 从基类的唯一指针中声明派生类的类型
- C :模板类别的唯一_ptr多态性,该类别从非模板基类得出
- 基类的指针数组:如何调用唯一的派生类方法
- 如何从基类的唯一指针获取子类的成员
- 转换为唯一基类指针的向量
- 通常继承的基类的唯一实例
- 具有基类唯一ptr的类的复制构造函数
- 通过基类容器访问派生类唯一变量的最佳方式
- 如何初始化基类中的唯一变量(继承)
- 从基类对象的指针向量调用派生类的唯一函数