0

可能重复:
在 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 Eat方法。

即使尝试dynamic_cast it也不起作用:dynamic_cast失败

dynamic_cast<Bear*>(&a.at(0));

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

4

2 回答 2

4

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

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

我假设void Animal::Eat()inBear.cpp是一个错字,否则您的代码将无法编译。

还有,const void?你想确保你不修改任何东西?

于 2012-08-20T08:34:19.397 回答
1

You need two things to enable polymorphism: virtual functions and pointers. You don't have pointers. Your std::vector must be a vector of Animal* (or std::unique_ptr in C++11), not Animal.

std::vector<Animal*> a;
Bear b;
a.push_back(b);
a[0] -> eat();

Then, your bear function eat() is with Animal::. Correct it.

In addiction, also the destructor must be virtual: destructors calls must be polymorphic as well.

于 2012-08-20T08:44:47.367 回答