百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 文章教程 > 正文

朝文分享(54):深入C++(二十一)——多态

xsobi 2025-01-03 19:38 1 浏览

分享兴趣,传播快乐,增长见闻,留下美好!

亲爱的您,这里是LearningYard新学苑。

今天小编为大家带来“深入C++(二十一)——多态”,欢迎您的访问。

Share interest, spread happiness, increase knowledge, and leave beautiful.

Dear, this is the LearingYard Academy!

Today, Dive into C++ (21) - Polymorphism ,welcome to visit!



一、基本语法

1. Basic grammar

编写一个执行各种动物叫声的全局函数doSpeak。一种动物就是一个类,每种动物有着不同的叫声,都能通过这个全局函数执行。

Write a global function called doSpeak that executes various animal calls. An animal is a class, each with a different call, that can be executed by this global function.

但执行后可以发现,即使创建的是猫类对象,但并没有输出猫的叫声。为什么?因为全局函数的参数是父类引用,即使可以指向子类对象,但仍只能调用父类中的函数,函数的地址是不变的。

But if you execute it, you can see that even though you created a cat object, it doesn't output a cat meow. Why? Because the arguments of global functions are superclass references, even though they can point to child objects, only functions in the superclass can be invoked, and the addresses of functions remain the same.

那该如何实现子类函数的调用呢?将父类的函数地址设为可变的,即虚函数的定义。这样,子类重写父类的虚函数时,子类的函数会被记录到父类的虚函数表中。子类对象就可以通过父类指针或引用调用到自己的函数。

How do you implement subclass function calls? We set the address of the superclass's function to mutable, which is the definition of the virtual function. This way, when a child class overrides a superclass's virtual function, the child class's function is recorded in the superclass's vtable. Subclass objects can then be called into their own functions by means of a superclass pointer or reference.

如此一来,每个动物都能调用到自己的叫声函数,实现多态。

In this way, each animal can call its own call function, achieving polymorphism.

二、 纯虚函数和抽象类

2. Pure virtual functions and abstract classes

上述案例中,父类的虚函数是没有任何意义的。为了简洁,一般将父类的虚函数改成纯虚函数。

In this case, the virtual function of the superclass has no meaning. For the sake of brevity, it is common to change the virtual function of the superclass to a pure virtual function.

而含有纯虚函数的类被称为抽象类。抽象类不允许实例化对象。

A class that contains pure virtual functions is called an abstract class. Abstract classes are not allowed to instantiate objects.

抽象类的子类需要重写父类中的虚函数,否则不能实例化对象。

A subclass of an abstract class needs to override a virtual function in its superclass or it cannot instantiate an object.

三、 虚析构和纯虚析构

3. Virtual destruction and pure virtual destruction

当需要释放子类对象时,父类指针无法调用子类的析构,导致部分内存没有释放,造成内存泄漏。

When the child class object needs to be deallocated, the parent class pointer cannot call the destruction of the child class, resulting in some memory not being deallocated, causing a memory leak.

通过将父类析构替换成虚析构,利用虚函数的特性,使得子类析构也能调用,避免内存泄漏。

By replacing the parent destructor with virtual destructor, the property of virtual function is used to make the child destructor can also be called to avoid memory leak.

纯虚析构与纯虚函数的格式一样。但若想要知道析构是否被调用,可以在函数外进行编写。

Pure virtual destructors have the same format as pure virtual functions. But if you want to know if the destructor has been called, you can write it outside the function.



今天的分享就到这里了,

如果您对文章有独特的想法,

欢迎给我们留言。

让我们相约明天,

祝您今天过得开心快乐!

That's all for today's sharing.

If you have a unique idea about the article,

please leave us a message,

and let us meet tomorrow.

I wish you a nice day!

翻译:网易有道翻译

本文由LearningYard学苑整理并发出,如有侵权请后台留言沟通.

文案|Dongyang

排版|Dongyang

审核|hong

Learning Yard 新学苑

相关推荐

Asp.Net快速开发平台(敏捷开发框架)

前言:敏捷开发框架的名称由来呢?我希望开发项目可以结构化的,轻量级的,就像敏捷开发团队一样的高效快速,通过它可以快速开发一个项目。1:什么是敏捷开发框架?答:敏捷开发框架是一款Asp.Net轻量级智能...

Gradio.NET:简化.NET Web应用开发的新利器

...

.NET 8 实现通用权限开发框架

...

干货来了!推荐10个用于C#.NET开发的基本调试工具

今天给各位网友分享10个用于C#.NET开发的基本调试工具,掌握了这10个工具,大家就可以轻松玩转C#.NET开发与调试。话不多说,直接上干活!!1、VisualStudio...

「Net Core开发」webapi 开发

之前的文章:【NetCore开发】C#开发跨平台程序...

.NET5.0和Quartz.NET开发的极简任务调度平台

任务调度是让系统自动化完成特定的任务,在预约的时间点执行任务的过程。任务调度在不同业务需求情况也不一样,有些可能是有着上千上万个任务,需要统一管理;有些可能是为了方便异常进行提醒、监控。项目简介...

3个基于.Net开发的、开源远程管理工具

我是编程乐趣,一个10年.Net开发经验老程序员,点击右上方“关注”,每天为你分享开源项目和编程知识。盘点3个基于.Net开发的、开源Windows远程管理工具。...

.NET 9 中的新增功能:每个开发人员都应该知道的基本更新

...

跨平台开发的未来:如何在 .NET 6 上构建高效的跨平台应用

跨平台开发是当今软件开发领域的一大热点。开发者一直在寻找能够让他们编写一次代码并部署到多个操作系统(如Windows、Linux和macOS)上的工具和框架。传统的开发方式需要针对每个操作系统编...

.Net开发框架最终版将与Win10同步问世

对许多用户而言,7月29日最受关注的事件是Windows10的发布。但事实上,除了Windows10外这一日微软还会带来更多的亮点。届时微软还将发布针对Windows通用应用程序平台的(UWP)....

微软推出 .NET Aspire云端框架:可改进分布式应用开发流程

IT之家5月24日消息,据微软官方新闻稿,微软近日推出一款能够简化.NET云端开发的.NETAspire开发框架,该框架主要包含工具、模板和NuGet包,允许用户“更容易地”创建分布...

VOL.NET6开发MES系统第二篇——基础数据

大家好,我是李工。系统框架我们已经运行起来了,今天我们正式开始搭建MES系统。MES系统主要实现四大模块:基础数据、生产管理、生产数据、操作记录;今天我们主要演示一个单表的增删改查以及权限控制,我们不...

.NET混合开发解决方案1 WebView2简介

在我的博客《...

VOL.NET6开发MES系统第一篇——搭建程序

大家好,我是李工,接下来我将用VOL.NET6搭建一套MES系统;有兴趣的小伙伴们可以一起学习。一、下载源码VOL...

盘点5个基于SkiaSharp开发的.Net开源图形项目

...