私はC++でエコシステムシミュレーションを行っています。その中には、草食動物や肉食動物になる動物があります。C++異なる署名を持つ多態性呼び出し派生クラスメソッド
肉食動物は他の草食動物しか食べないので、肉食動物eat()
を食べるときは、彼らは草食動物の方向を知る必要があります。
void HERBIVORE::Eat(CELL field[40][30], int x, int y)
{
}
void CARNIVORE::Eat(CELL field[40][30], int x, int y, char direction)
{
}
を使用する場合:them.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);
};
関数定義の下にあるいただきました、以下のように、彼らは単に食べ、
草食動物は草を食べるので、彼らは何の方向性を知っている必要はありませんvirtual
、dynamic-bindingが使用されるため、コンパイラは実行時に関数呼び出しを解決します。しかし、どうすればこのようなコードを書くことができます:
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
それは食べる基底クラスを参照している()
このライン '場合((this_animalはdynamic_cast))'、あなたのデザインを再考するべきものです。私の2セント。 –
skypjack
私は、仮想関数は同じ署名を持っている必要があります - 私はドキュメントをチェックします。 – tomascapek
仮想関数をオーバーライドする場合は、同じシグネチャを指定する必要があります – DarthRubik