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”信息,而不复制熊的信息