其他分享
首页 > 其他分享> > 为什么我们需要C中的虚函数?

为什么我们需要C中的虚函数?

作者:互联网

我正在学习C而我正在进入虚拟功能.

根据我的阅读(在书中和在线),虚函数是基类中的函数,您可以在派生类中重写它们.

但是在本书前面,当学习基本继承时,我能够在不使用虚拟的情况下覆盖派生类中的基本函数.

那我在这里错过了什么?我知道虚拟功能还有更多功能,而且它似乎很重要,所以我想清楚它究竟是什么.我在网上找不到直接答案.

解决方法:

以下是我不仅理解virtual功能的原因,而且还了解为什么需要它们:

假设你有这两个类:

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."

到目前为止一切都那么好吧?动物吃普通食物,猫吃老鼠,都没有虚拟.

让我们稍微改变它,以便通过中间函数调用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."

哦……我们把猫送进了func(),但它不会吃老鼠.你应该重载func()所以它需要Cat *吗?如果你必须从Animal获得更多的动物,他们都需要自己的func().

解决方案是使Animal类中的eat()成为一个虚函数:

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."

完成.

标签:c,virtual-functions
来源: https://codeday.me/bug/20190911/1802631.html