为什么派生模板类的函数不覆盖非模板基类的纯虚函数?

tambre
#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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章