我有以下课程:
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进行模板化),这应该不是问题。这是怎么回事?
答案 0 :(得分:0)
函数make_class
返回一个BasePtr
:
自动make_class(const T&x)-> BasePtr
然后在您的main
函数中说:
auto ptr = make_class(5);
,即ptr
是BasePtr
。该函数无法知道指针实际上指向派生类。因此,没有hello()
函数可以被调用。