我正在学习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);//输出:“我在吃老鼠。”
完成了