Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么';t派生模板类';函数重写非模板基类';什么是纯虚函数?_C++_Templates_C++14 - Fatal编程技术网

C++ 为什么';t派生模板类';函数重写非模板基类';什么是纯虚函数?

C++ 为什么';t派生模板类';函数重写非模板基类';什么是纯虚函数?,c++,templates,c++14,C++,Templates,C++14,为什么Base::foo()仍然是抽象的,即使Cloud实现了它? 我如何实现这一点,使Cloud仍然源于Base,覆盖foo(),并且仍然以typename Bar为模板?该函数是一条红鲱鱼:std::vector是Base对象的向量,因此,push_-back尝试从您的云构建Base 使用std::vector。该函数是一个转移视线的函数:std::vector是Base对象的向量,因此push_back尝试从云中构建Base 使用std::vector代替。这里的模板只是分散注意力-它们与

为什么
Base::foo()
仍然是抽象的,即使
Cloud
实现了它?

我如何实现这一点,使
Cloud
仍然源于
Base
,覆盖
foo()
,并且仍然以
typename Bar
为模板?

该函数是一条红鲱鱼:
std::vector
Base
对象的向量,因此,
push_-back
尝试从您的
云构建
Base


使用
std::vector

该函数是一个转移视线的函数:
std::vector
Base
对象的向量,因此
push_back
尝试从
云中构建
Base


使用std::vector代替。

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

std::vector
包含
Base
对象,而不是引用,因此如果您尝试向其添加任何派生实例,它将尝试执行切片,尝试从传递的
云中实例化
Base
。然而,这不仅不是您可能想要的,而且是不可能的,因为直接的
Base
对象由于
Base
是一个抽象类而不可能存在


很可能你想要的是在保持多态行为的同时将你的对象推到向量中。为此,您必须有一个指向基类的指针向量,并将指针推送到元素——很可能是在堆上分配的,并具有一些处理其生存期的方法。一个简单的(尽管可能不是最优的)解决方案可能是使用
std::vector
和使用
std::make_shared
分配的push对象

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

std::vector
包含
Base
对象,而不是引用,因此如果您尝试向其添加任何派生实例,它将尝试执行切片,尝试从传递的
云中实例化
Base
。然而,这不仅不是您可能想要的,而且是不可能的,因为直接的
Base
对象由于
Base
是一个抽象类而不可能存在


很可能你想要的是在保持多态行为的同时将你的对象推到向量中。为此,您必须有一个指向基类的指针向量,并将指针推送到元素——很可能是在堆上分配的,并具有一些处理其生存期的方法。一个简单的(尽管可能不是最优的)解决方案可能是使用
std::vector
和使用
std::make_shared
分配的push对象

或者一个
std::vector
,如果你不喜欢指针。@raket1111为什么你不喜欢指针?它们配泡菜很好吃。撇开玩笑不谈,
std::reference_wrapper
不会具有与
std::unique_ptr
Base
相同的所有权语义。没错,我没有想到这一点。我只是把它放在那里:)或者一个
std::vector
,如果你不喜欢指针。@Rakete1111为什么你不喜欢指针?它们配泡菜很好吃。撇开玩笑不谈,
std::reference_wrapper
不会具有与
std::unique_ptr
Base
相同的所有权语义。没错,我没有想到这一点。我只是想说:)谢谢你解释得很好的回答!保持多态性行为绝对是我的本意。我决定改用
std::unique_ptr
,因为我不需要引用计数。@tambre在这种情况下,你需要给
Base
一个虚拟析构函数。谢谢你解释得很好!保持多态性行为绝对是我的本意。我决定改用
std::unique_ptr
,因为我不需要引用计数。@tambre在这种情况下,您需要给
Base
一个虚拟析构函数。
#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);
}
error C2259: 'Base': cannot instantiate abstract class
note: due to following members:
note: 'void Base::foo(void)': is abstract