为什么我们需要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