#include <vector>
class Base
{
public:
virtual void foo() = 0;
};
template<typename Bar>
class Cloud : public Base
{
public:
void foo()
{
}
};
class Water
{
};
int main()
{
Cloud<Water> cloud;
std::vector<Base> stuff;
stuff.push_back(cloud);
}
上面显示的代码在 MSVC 14.1 上失败并显示以下内容:
error C2259: 'Base': cannot instantiate abstract class
note: due to following members:
note: 'void Base::foo(void)': is abstract
为什么Base::foo()
即使Cloud
实现了它仍然保持抽象?
我将如何以Cloud
仍然派生自Base
、覆盖foo()
并保持模板化的方式实现这一点typename Bar
?
这里的模板只是一种干扰 - 它们与您的问题无关。
std::vector<Base>
包含Base
对象,而不是引用,因此如果您尝试向其中添加任何派生实例,它将尝试执行切片,尝试Base
从传递的cloud
. 然而,这除了不是您可能想要的之外,也是不可能的,因为直接Base
对象由于Base
是抽象类而不能存在。
很可能您想要的是将您的对象推入向量中,同时仍保持多态行为。为此,您必须有一个指向基类的指针向量,并将指向元素的指针推入 - 很可能在堆上分配,并通过某种方式处理它们的生命周期。一个简单的(尽管可能不是最佳的)解决方案可能是将 astd::vector<std::shared_ptr<Base>>
和 push 对象分配给std::make_shared
.
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句