C ++继承:不调用派生类的虚方法

时间:2012-08-20 08:32:59

标签: c++ inheritance

  

可能重复:
  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

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

2 个答案:

答案 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::一致。纠正它。

另外,析构函数也必须是虚拟的:析构函数调用也必须是多态的。