C++ C++;继承:未调用派生类的虚拟方法

C++ C++;继承:未调用派生类的虚拟方法,c++,inheritance,C++,Inheritance,可能重复: 我在C++中有继承问题。在这里,我编写了一个简单的代码来说明我的问题: //Animal.h class Animal { public: Animal(); ~Animal(); virtual const void Eat(); }; //Bear.h class Bear: public Animal { public: Animal(); ~Animal(); virtual const void Eat(); }; //Animal.cpp const voi

可能重复:

我在C++中有继承问题。在这里,我编写了一个简单的代码来说明我的问题:

//Animal.h
class Animal
{
public:

Animal();
~Animal();

virtual const void Eat();
};

//Bear.h
class Bear: public Animal
{
public:

Animal();
~Animal();

virtual const void Eat();
};

//Animal.cpp
const void Animal::Eat() {
}

//Bear.cpp
const void Animal::Eat() {
 //Do something
}
现在,在另一个类中,我声明了一个应该容纳动物的向量,然后我创建了一个
,并将它推到我的向量中:

std::vector<Animal> a;
Bear b;
a.push_back(b);

我做错了什么?是因为我缺少复制构造函数吗?

你必须创建一个向量来保存动物(智能)指针

对象向量受到对象切片的影响

我假设
Bear.cpp
中的
void Animal::Eat()
是一个输入错误,否则您的代码将无法编译


另外,
常量无效
?您想确保不修改任何内容吗?

您必须创建一个包含动物(智能)指针的向量

对象向量受到对象切片的影响

我假设
Bear.cpp
中的
void Animal::Eat()
是一个输入错误,否则您的代码将无法编译


另外,
常量无效
?是否要确保不修改任何内容?

启用多态性需要两件事:虚拟函数和指针。你没有指针。您的
std::vector
必须是
Animal*
(或std::unique_ptr在C++11中)的向量,而不是
Animal

std::vector<Animal*> a;
Bear b;
a.push_back(b);
a[0] -> eat();
std::向量a;
熊b;
a、 推回(b);
a[0]->eat();
然后,熊函数
eat()
Animal::
一起使用。纠正它


在成瘾中,析构函数也必须是虚拟的:析构函数调用也必须是多态的。

启用多态性需要两件事:虚拟函数和指针。你没有指针。您的
std::vector
必须是
Animal*
(或std::unique_ptr在C++11中)的向量,而不是
Animal

std::vector<Animal*> a;
Bear b;
a.push_back(b);
a[0] -> eat();
std::向量a;
熊b;
a、 推回(b);
a[0]->eat();
然后,熊函数
eat()
Animal::
一起使用。纠正它


在上瘾中,析构函数也必须是虚拟的:析构函数调用也必须是多态的。

看这个:看这个:一个有趣的问题是C++11(vector使用移动语义)是否仍然存在这个问题。事实上,我认为它应该被“神奇地”修复。毕竟,当时不应该复制任何动物,但熊应该是原样的(大概包括vtable)?@Damon,这一点都不成问题。当您声明
std::vector
时,您明确表示想要
Animal
对象。“你将不再有熊了。”达蒙,试着想想你将如何储存它。(以及操作符[]将如何实现)一个有趣的问题是C++11(vector使用移动语义)是否仍然存在这个问题。事实上,我认为它应该被“神奇地”修复。毕竟,当时不应该复制任何动物,但熊应该是原样的(大概包括vtable)?@Damon,这一点都不成问题。当您声明
std::vector
时,您明确表示想要
Animal
对象。“你将不再有熊了。”达蒙,试着想想你将如何储存它。(以及操作符[]将如何实现)我考虑过切片问题,但没想到指针会解决这个问题。多亏了大家,我学到了一些新的东西,但我仍然很好奇,当我把熊放在动物载体上时会发生什么?它是否调用了基复制构造函数并将animal而不是bear放置?@ISTB bear是动物(因为继承关系)。所以,如果你把一只熊放在动物(而不是动物*)中,就像让动物a=b,其中b是熊:你可以这样做,但你只在动物中复制熊的一些信息(它们的共同成员)。诚恳地说,我不知道在这种情况下,它是被称为动物的构造器,还是被称为熊的构造器,然后我们有一个熊在动物中的部分副本,正如我所说的。结果是一样的:你没有熊,只有动物:所以调用了eat()of Animal。是的,我认为首先调用了Animal构造函数,然后是copy构造函数,它当然只复制“Animal”熊的信息但不是熊的信息我认为关于切片问题,但我没想到指针会解决这个问题。多亏了大家,我学到了一些新的东西,但我仍然很好奇,当我把熊放在动物载体上时会发生什么?它是否调用了基复制构造函数并将animal而不是bear放置?@ISTB bear是动物(因为继承关系)。所以,如果你把一只熊放在动物(而不是动物*)中,就像让动物a=b,其中b是熊:你可以这样做,但你只在动物中复制熊的一些信息(它们的共同成员)。诚恳地说,我不知道在这种情况下,它是被称为动物的构造器,还是被称为熊的构造器,然后我们有一个熊在动物中的部分副本,正如我所说的。结果是一样的:你没有熊,只有动物:所以调用了eat()的Animal。是的,我认为首先调用了Animal构造函数,然后是copy构造函数,它当然只复制熊的“Animal”信息,而不复制熊的信息