0

いくつかのクラスがあり、すべてがAnimalという名前の基本クラスから派生しているとしましょう。

Cat
Dog
Parrot
EveryAnimalInExistance

各クラスは、次のような独自の抽象メソッドのメソッドを実装します。

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

次に、というメソッドがあります

observeAnimal(Animal* everyAnimalInExistance)

何千もの潜在的な範囲から潜在的な動物を渡すにはどうすればよいですか?

everyAnimalInExistance.hunt();

私が理解しているように、C ++では、オブジェクトは「スライス」され、基本クラスの独自のメソッドを呼び出そうとします。正しいメソッドを呼び出すには、型キャストが必要です。

RTTIは広大で多数あるため、プロジェクトのすべての環境で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

頭の質問に直接答える...はい、基本クラスであるCuriously Recurring Template Patternから派生クラスメソッドを呼び出す方法が(少なくとも)あります。実際、それは静的ポリモーフィズムと呼ばれています

于 2013-08-28T09:33:36.817 に答える