gpt4 book ai didi

C++ 多态性——调用具有不同签名的派生类方法

转载 作者:行者123 更新时间:2023-11-30 02:32:13 25 4
gpt4 key购买 nike

我正在用 C++ 进行生态系统模拟。其中有可以是食草动物或食肉动物的动物。

食肉动物只吃其他食草动物,所以当食肉动物eat()时,它们必须知道食草动物的方向。

食草动物只吃草,所以它们不需要知道任何东西的方向,它们只吃它们下面的东西。as

class ANIMAL
{
public:
ANIMAL(...)
: ...
{
}
virtual ~ANIMAL()
{}

//does nothing, just stating that every animal must implement an Eat() method
virtual void Eat() = 0;
};

class HERBIVORE : public ANIMAL
{
public:
HERBIVORE(...)
: ANIMAL(...)
{}
void Eat(CELL field[40][30], int x, int y);
};


class CARNIVORE : public ANIMAL
{
public:
CARNIVORE(...)
: ANIMAL(...)
{}

void Eat(CELL field[40][30], int x, int y, char direction);
};

函数定义如下:

void HERBIVORE::Eat(CELL field[40][30], int x, int y)
{
}

void CARNIVORE::Eat(CELL field[40][30], int x, int y, char direction)
{
}

当使用 virtual 时,会使用动态绑定(bind),因此编译器会在运行时解析函数调用。但是我怎样才能写出这样的代码:

  if (dynamic_cast<CARNIVORE*>(this_animal))    //if carnivore
this_animal->Eat(field, i, j, direction);

if (dynamic_cast<HERBIVORE*>(this_animal)) //if herbivore
this_animal->Eat(field, i, j);

没有得到这个错误?

问题:

我收到一个错误:

'ANIMAL::Eat': function does not take 3 arguments

'ANIMAL::Eat': function does not take 4 arguments

它指的是不带参数的基类 Eat()

最佳答案

您的类目前没有覆盖基类中的纯虚方法。任何虚拟覆盖都应具有与基类声明相同的签名。解决这个问题的一个简单方法是让所有重载都可以访问方向,定义如下:

void Eat(CELL field[40][30], int x, int y, char direction)
{
...
}

这样需要方向的重载就有了,不需要方向的可以忽略。此外,不需要 dynamic_cast

关于C++ 多态性——调用具有不同签名的派生类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36669661/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com