ベストアンサー1
私が理解した方法は次のとおりですvirtual
関数はどのようなものか、なぜ必要なのかを説明します。
次の 2 つのクラスがあるとします。
class Animal
{
public:
void eat() { std::cout << "I'm eating generic food."; }
};
class Cat : public Animal
{
public:
void eat() { std::cout << "I'm eating a rat."; }
};
メイン関数内:
Animal *animal = new Animal;
Cat *cat = new Cat;
animal->eat(); // Outputs: "I'm eating generic food."
cat->eat(); // Outputs: "I'm eating a rat."
ここまでは順調ですね。動物は一般的な食べ物を食べ、猫はネズミを食べますが、すべてvirtual
.
eat()
ここで、中間関数 (この例のための単純な関数) を介して呼び出されるように少し変更してみましょう。
// This can go at the top of the main.cpp file
void func(Animal *xyz) { xyz->eat(); }
現在、私たちの主な機能は次のとおりです。
Animal *animal = new Animal;
Cat *cat = new Cat;
func(animal); // Outputs: "I'm eating generic food."
func(cat); // Outputs: "I'm eating generic food."
うーん... Cat を に渡しましたfunc()
が、ネズミを食べません。 がfunc()
かかるようにオーバーロードする必要がありますかCat*
? Animal からさらに多くの動物を派生させる必要がある場合、それらすべてに独自の が必要になりますfunc()
。
解決策は、クラスeat()
からAnimal
仮想関数を作成することです。
class Animal
{
public:
virtual void eat() { std::cout << "I'm eating generic food."; }
};
class Cat : public Animal
{
public:
void eat() { std::cout << "I'm eating a rat."; }
};
主要:
func(animal); // Outputs: "I'm eating generic food."
func(cat); // Outputs: "I'm eating a rat."
終わり。