C++ で仮想関数が必要なのはなぜですか? 質問する

C++ で仮想関数が必要なのはなぜですか? 質問する

私が読んだところによると、仮想関数派生クラスでオーバーライドできる基本クラスの関数です。

しかし、以前、基本的な継承、 を使用せずに派生クラスの基本関数をオーバーライドできましたvirtual

ここで何が欠けているのでしょうか? 仮想関数には他にも多くの機能があることはわかっていますし、それが重要だと思われるので、それが正確に何であるかを明確にしたいと思います。

ベストアンサー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."

終わり。

おすすめ記事