可能重复:
Store two classes with the same base class in a std::vector
我在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
}
现在,在另一个课程中,我宣布一个应该拥有动物的矢量,然后我创建一个Bear
并将其推入我的矢量中:
std::vector<Animal> a;
Bear b;
a.push_back(b);
现在的问题是,当我遍历我的动物载体并尝试调用Eat()
时,会调用基类(动物)的Eat方法,但不会调用Bear
{{1} } 方法。
即使尝试使用Eat
也不起作用:dynamic_cast it
失败
dynamic_cast
我做错了什么?是因为我缺少复制构造函数吗?
答案 0 :(得分:4)
你必须创建一个包含动物(智能)指针的向量。
对象矢量会受到对象切片的影响。
我假设void Animal::Eat()
中的Bear.cpp
是拼写错误,否则您的代码将无法编译。
另外,const void
?你想确保你不修改任何东西吗?
答案 1 :(得分:1)
启用多态性需要两件事:虚函数和指针。你没有指针。您的std::vector
必须是Animal*
(或C ++ 11中的std :: unique_ptr)的向量,而不是Animal
。
std::vector<Animal*> a;
Bear b;
a.push_back(b);
a[0] -> eat();
然后,您的承担函数eat()
与Animal::
一致。纠正它。
另外,析构函数也必须是虚拟的:析构函数调用也必须是多态的。