0

假设有一些类,都派生自一个名为 Animal 的基类:

Cat
Dog
Parrot
EveryAnimalInExistance

每个类都实现了自己的抽象方法,例如:

attack()
defend()
hunt()
breed()

然后有一个方法叫

observeAnimal(Animal* everyAnimalInExistance)

我如何从成千上万的潜在动物中通过任何潜在动物,然后简单地调用

everyAnimalInExistance.hunt();

据我了解,在 c++ 中,对象将被“切片”,它会尝试调用基类自己的方法,并且需要进行类型转换才能调用正确的方法。

我无法确定 RTTI 是否在项目的每个环境中都可用,因为它庞大且数量众多,有人能告诉我我应该采取的方法吗?

4

2 回答 2

4

您的observeAnimal(Animal* everyAnimalInExistance)方法不执行切片,因为参数是通过指针接收的。

在指针或引用的情况下,虚拟函数将在您的动物园中正确调用:)。everyAnimalInExistance切片仅在您按值传递时发生。

换句话说:

class Animal {
    virtual void hunt() = 0;
}

observeAnimal(Animal* everyAnimalInExistance)
{
    everyAnimalInExistance->hunt(); // correct
}
observeAnimal(Animal everyAnimalInExistance)
{
    everyAnimalInExistance.hunt(); // sliced, incorrect (call into base class)
}
observeAnimal(Animal& everyAnimalInExistance)
{
    everyAnimalInExistance.hunt(); // correct
}

std::vector<Animal> slice_and_dice;
// add animals to vector here (actually this vector will slice the animals
// when you add them)
slice_and_dice[0].hunt(); // incorrect, sliced

std::vector<Animal*> pointer_zoo;
// add animals to vector here
pointer_zoo[0]->hunt(); // correct
于 2013-03-25T15:36:51.743 回答
0

直接回答你的问题......是的,(至少)有一种方法可以从基类调用派生类方法,即奇怪重复的模板模式。其实这就是所谓的静态多态

于 2013-08-28T09:33:36.817 回答