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

我正在学习C++,我正在学习虚拟函数。

从我所读到的(在书中和网上),虚函数是基类中的函数,可以在派生类中重写

但在本书的早些时候,在学习基本继承时,我能够在派生类中重写基函数,而无需使用virtual

那么我在这里错过了什么?我知道虚拟函数还有很多,它似乎很重要,所以我想弄清楚它到底是什么。我只是在网上找不到一个直截了当的答案

下面是我如何理解的,不仅仅是什么是virtual函数,还有为什么需要它们:

假设您有以下两个类:

类动物
{
公众:
void eat(){std::cout<<“我在吃普通食品。”;}
};
猫类:公共动物
{
公众:
void eat(){std::cout<<“我在吃老鼠。”;}
};

在您的主要功能中:

动物*动物=新动物;
猫*Cat=新猫;
动物->吃();//输出:“我吃的是普通食品。”
cat->吃();//输出:“我在吃老鼠。”

到目前为止还不错,对吧?动物吃普通食物,猫吃老鼠,都没有virtual

现在让我们稍微修改一下,以便通过中间函数调用eat()

//这可以放在main.cpp文件的顶部
void func(Animal*xyz){xyz->eat();}

现在我们的主要功能是:

动物*动物=新动物;
猫*Cat=新猫;
func(动物);//输出:“我吃的是普通食品。”
func(cat);//输出:“我吃的是普通食品。”

啊哦。。。我们把一只猫传给func(),但它不会吃老鼠。您是否应该重载func(),因此需要Cat*?如果你必须从动物身上衍生出更多的动物,它们都需要自己的func()

解决方案是使用Animala类虚拟函数制作eat()

类动物
{
公众:
虚拟空吃({std::cout<<“我在吃普通食品。”;}
};
猫类:公共动物
{
公众:
void eat(){std::cout<<“我在吃老鼠。”;}
};

主要内容:

func(动物);//输出:“我吃的是普通食品。”
func(cat);//输出:“我在吃老鼠。”

完成了

发表评论