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

杰克·威尔逊

我正在学习C ++,并且刚开始使用虚函数。

从我阅读的内容(在书中和在线上)中,虚拟函数是基类中的函数,您可以在派生类中重写这些函数。

但是在本书的前面,当学习基本继承时,我无需使用即可覆盖派生类中的基本函数virtual

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

佩里

这是我不仅了解什么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."

到目前为止一切顺利,对吗?动物不吃普通食物,猫不吃老鼠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."

呃...我们把一只猫送进了func(),但是它不会吃老鼠。您是否应该超载,func()所以需要一个Cat*如果您必须从“动物”中衍生出更多动物,则它们都需要自己的动物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."

做完了

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

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

为什么我们需要visibleCells函数(UICollectionView)

为什么我们需要在此脚本中调用“ c.set.bind(c)”?

为什么我们到底需要Java中的StringBuffer

为什么我们需要Java中的默认方法?

为什么我们需要纯<?>在Java中?

为什么我们在MongoDB中需要created_at

为什么我们需要python中的协程?

为什么我们需要Java中的Properties类?

为什么我们需要Kubernetes中的服务帐户?

为什么我们在芹菜中需要签名?

为什么我们在git中需要SSH密钥?

为什么我们需要Clojure中的'in(require'[...]])?

为什么我们需要Java中的弱引用

为什么我们在Python中需要“ finally”子句?

为什么我们在Hadoop堆栈中需要ZooKeeper?

为什么我们在Typescript中需要任何类型?

为什么我们需要Python中的属性?

为什么我们在区块链中需要 TLSNotary?

为什么我们在C ++中需要飞船<=>运算符?

为什么我们需要C中的终止符

为什么我们需要在C#中锁定并反对?

为什么在C#方法中我们需要多个`await`语句?

为什么我们需要C ++中的基本数据类型

为什么我们在这个程序中需要虚拟(Turbo C++)?

构造函数中的C ++虚函数

为什么我们需要在 C++20 中的函数概念参数之后使用 auto?

为什么我们需要一个默认的构造函数来在C ++中通过引用传递对象?

为什么我们需要在React Hook中返回一个函数?