繁体   English   中英

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

[英]Why doesn't derived templated class's function override the non-templated base class's pure virtual function?

#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

为什么即使Cloud实现了Base::foo()仍然是抽象的?
我将如何以Cloud仍从Base派生,覆盖foo()并保持使用typename Bar模板化的方式来实现此目的?

该函数是一个红色鲱鱼: std::vector<Base>Base对象的向量,因此push_back尝试从Cloud<Water>构造Base

请改用std::vector<std::unique_ptr<Base>>

这里的模板只是分散注意力-与您的问题无关。

std::vector<Base>包含Base 对象 ,而不是引用,因此,如果您尝试向其添加任何派生实例,它将尝试执行切片,并尝试从传递的cloud实例化Base 但是,除了可能不是您想要的之外,这是不可能的,因为由于Base是抽象类,所以不能存在直接的Base对象。

您最可能想要的是将对象推入向量中,同时仍保持多态行为。 为此,您必须具有指向基类的指针向量,并将指针推入元素-最有可能在堆上分配,并且具有处理其生命周期的某种方式。 一个简单的(虽然可能不是最佳的)解决方案可能具有std::vector<std::shared_ptr<Base>>并推送分配有std::make_shared对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM