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