之前在面试的时候被问过懂不懂C++,懂不懂“多态”。我之前搞科研一直在用Python,不会C++。完全没听过“多态”这个词,只听说过“多模态”(无端联系,搞深度学习搞的)。全文主要记录了我的几大疑问:什么是多态?什么是面向对象编程?Python是面向对象编程(OOP)语言吗?什么是编译?除了面向对象编程,还有哪些编程范式?

一、什么是多态?

多态的字面意思是“多种形态”。在C++中,它指通过统一的接口调用不同类型的对象,产生不同的行为结果。例如:你可以命令“动物”发出叫声,但具体是猫叫还是狗叫,取决于实际对象的类型。

1. 如何实现多态?

最常见的多态形式是通过虚函数继承实现的。

虚函数:在基类中用virtual关键字声明函数,子类可以重写(override)该函数。

class Animal {
public:
virtual void sound() { cout << "动物叫" << endl; } // 虚函数
};
class Cat : public Animal {
public:
void sound() override { cout << "喵喵" << endl; } // 重写虚函数
};
int main() {
Animal* animal = new Cat();
animal->sound(); // 输出“喵喵”而非“动物叫”
}

此时,基类指针animal实际指向的是子类对象,调用虚函数时会自动选择子类的实现。

看到这里我隐约想到神经网络里面,Python搭建网络的时候继承父类nn.Module

2. 为什么需要多态?

  1. 代码复用性:通过基类接口统一处理所有子类对象,避免重复代码。
  2. 扩展性:新增子类时(如添加“鸟”类继承“动物”),原有代码无需修改,只需实现新的虚函数即可。
  3. 灵活性:程序运行时可以根据实际对象类型动态调整行为,例如游戏中的不同角色执行不同的攻击动作。

想象你有一个通用遥控器(基类指针),可以控制不同品牌的电视(子类对象)。按下“开机”按钮(调用虚函数)时,索尼电视会显示LOGO,三星电视会播放启动音乐——这就是多态:同一个操作(开机),不同对象(电视)产生不同行为。

通过掌握多态,我们可以写出更优雅、易维护的代码,这也是面向对象编程的核心优势之一。

二、什么是面向对象编程?

我在看C++科普帖子的时候,总是能看到说它是面向对象编程,我一直不理解这个概念。面向对象编程?那我要是单身,没有对象呢?面向谁啊?

1. 是什么面向对象编程(OOP)?

面向对象编程(OOP)是一种以对象为核心的编程范式,它将程序中的数据和操作数据的逻辑封装成独立的“对象”。每个对象包含属性​(数据)和方法​(操作),并通过类来定义同类对象的共同特征。例如,“狗”是一个类,而具体的某条狗(如“旺财”)是一个对象,它有自己的颜色(属性)和吠叫(方法)。

2. 是什么对象?

对象是类的实例化结果,是程序中具体存在的事物。例如:

​类:人类(包含“姓名”“年龄”等属性,以及“说话”“行走”等方法)。

  • 对象:张三(姓名属性为“张三”,年龄属性为20)。
  • 对象的特点是将数据和行为统一管理,隐藏内部实现细节(封装性)。

那我好像懂了,有点像搭建一个神经网络类,通过实例化传进不同的参数,改变网络的层数,得到不同版本的网络。

3. 为什么需要面向对象编程?

  1. 代码复用性:通过继承,子类可以直接复用父类的属性和方法。例如“猫”和“狗”继承“动物”类后,无需重复定义“呼吸”“进食”等基础行为。
  2. ​扩展性:新增子类时(如“鸟类”继承“动物”),原有代码无需修改,只需重写虚函数或添加新方法。
  3. ​维护性:封装保护了对象内部数据,避免外部随意修改(如通过private限制访问权限)。
  4. ​灵活性:多态允许不同对象对同一操作做出不同响应。例如“动物”类的sound()方法,猫对象返回“喵喵”,狗对象返回“汪汪”。

三、Python是面向对象编程(OOP)语言吗?

看了那么多,感觉有些地方跟Python很像,于是产生了疑问,Python是面向对象编程(OOP)语言吗?我记得大家都说它是脚本语言?脚本语言又是什么?

Python是一种完全支持面向对象编程的语言。它具备OOP的三大核心特性:封装、继承和多态。

  • 封装:Python通过类(class)将数据(属性)和操作数据的方法(函数)封装在一起,例如通过__init__方法初始化对象属性,并通过访问修饰符(如双下划线__)控制属性的可见性。
  • 继承:子类可以继承父类的属性和方法,例如class Cat(Animal)表示Cat继承自Animal,子类可重写或扩展父类方法。
  • ​多态:不同类的对象可以调用同名方法但表现出不同行为。例如,Animal类的sound()方法在DogCat子类中被分别实现为“汪汪”和“喵喵”。

1. 为什么说Python是脚本语言?什么是脚本?

脚本语言(Scripting Language)是以文本形式编写解释执行的编程语言,主要用于自动化任务和快速开发。其特点包括:

  • ​无需编译:直接通过解释器逐行执行,例如Python的.py文件由解释器即时解析。
  • ​动态类型:变量类型在运行时自动推断,无需显式声明。
  • ​胶水语言特性:常用于整合其他语言模块(如C/C++),简化复杂系统的构建。

2. Python如何同时支持OOP和脚本语言特性?

Python是多范式语言,既支持面向对象编程,又具备脚本语言的灵活性:

​1) OOP的深度集成

  • 所有数据类型(如整数、字符串)本质都是对象。
  • 通过类实现复杂逻辑封装,适合大型项目开发。

​2) 脚本语言的便捷性

  • 单行代码即可完成简单任务(如print("Hello World"))。
  • 交互式环境(REPL)支持即时测试代码片段。

四、什么是编译?

那我又产生疑问了?Python无需编译,那什么是编译?为什么有的语言需要编译,有的语言不需要编译?

1. 编译的定义与核心过程

编译是将高级编程语言(如C、Java)​编写的源代码转换为计算机可直接执行的机器码或中间代码(如字节码)​的过程。其核心流程包括以下阶段:

  1. 词法分析:将源代码分解为有意义的单词(Token),例如识别变量名、运算符等。
  2. 语法分析:根据编程语言的语法规则,构建抽象语法树(AST),检查代码结构是否符合规范(如括号是否匹配)。
  3. 语义分析与中间代码生成:检查逻辑合法性(如变量类型是否匹配),并生成中间表示形式(如三地址码)。
  4. 代码优化:对中间代码进行性能优化,例如删除冗余计算或简化循环结构。
  5. 目标代码生成:将优化后的中间代码转换为特定平台的机器码或字节码(如Java的.class文件)。

    编译的最终产物是可执行文件​(如C语言的.exe)或平台无关的中间代码​(如Java的字节码)。其优势在于执行效率高,但需要针对不同平台重新编译。

2. 为什么有的语言需要编译,有的不需要?

编程语言是否需要编译,取决于其设计目标执行方式。主要分为以下两类:

1) ​需要编译的语言(编译型语言)​

典型代表:C、C++、Rust。

​原因

  • ​性能优先:直接编译为机器码,无需运行时解析,执行速度快。
  • ​硬件级控制:适合开发操作系统、嵌入式系统等需要直接操作硬件的场景。
  • ​静态类型检查:编译时即可发现类型错误,提升代码安全性。

2) 不需要编译的语言(解释型或混合型语言)​

典型代表:Python、JavaScript、Ruby。

​原因

  • ​解释执行:通过解释器逐行解析并执行代码,无需预编译,便于快速调试和跨平台运行。
  • ​动态特性支持:如Python的动态类型、反射等特性,依赖运行时环境解析代码。
  • ​混合执行模式
    • ​字节码+虚拟机​(如Java):先编译为中间代码,再由虚拟机解释执行,兼具跨平台性和效率。
    • ​即时编译(JIT)​​(如JavaScript的V8引擎):运行时动态编译热点代码,提升执行速度。

3) 编译与解释的核心区别

维度 编译型语言 解释型语言
执行方式 先编译后执行(一次性转换) 逐行解释执行(实时转换)
运行效率 高(机器码直接运行) 较低(需运行时解析)
开发效率 较低(需反复编译) 高(修改后直接运行)
跨平台性 依赖平台(需重新编译) 强(同一解释器支持多平台)
错误检测 编译时发现语法/类型错误 运行时才能发现部分错误

五、除了面向对象编程,还有哪些编程范式?

我隐约记得,除了面向对象编程,还有各面向过程编程,也不懂是什么意思。

编程范式是解决问题的不同方法论。C语言是面向过程编程。面向过程编程的核心思想是以函数为基本单元,通过一系列步骤解决问题,关注“怎么做”而非“谁来做”。其他的编程范式以后再说。

面向过程与面向对象的对比:

维度 面向过程 面向对象
基本单元 函数 类与对象
数据与逻辑 分离(数据通过参数传递) 封装(数据与方法绑定在对象内)
代码复用 低(需重复实现相似逻辑) 高(通过继承和多态复用代码)
适用规模 小型、简单任务(如算法实现) 大型、复杂系统(如游戏引擎)

0基础的人关于C++多态产生的一系列疑问的更多相关文章

  1. 0基础的人如何入门 Python ?Python难么?

    人生苦短,我用Python,为啥这么说,因为我们自动化测试有金句:学完Python,便可上天 ~ 废话不多说,相信很多人都听过之前的Python进入小学课本.Python进入浙江省高考等新闻,有这么多 ...

  2. 【转】WF4.0 (基础篇)

    转自:http://www.cnblogs.com/foundation/category/215023.html 作者:WXWinter  ——  兰竹菊梅★春夏秋冬☆ —— wxwinter@16 ...

  3. 0基础如何学Android开发

    链接:http://pan.baidu.com/s/1bIEIse 密码:ky7w https://pan.baidu.com/s/1i53bs6x提取码:0pwthttps://www.zhihu. ...

  4. 零基础的人怎么学习Java

    编程语言Java,已经21岁了.从1995年诞生以来,就一直活跃于企业中,名企应用天猫,百度,知乎......都是Java语言编写,就连现在使用广泛的XMind也是Java编写的.Java应用的广泛已 ...

  5. _00017 Kafka的体系结构介绍以及Kafka入门案例(0基础案例+Java API的使用)

    博文作者:妳那伊抹微笑 itdog8 地址链接 : http://www.itdog8.com(个人链接) 博客地址:http://blog.csdn.net/u012185296 博文标题:_000 ...

  6. 手把手0基础项目实战(一)——教你搭建一套可自动化构建的微服务框架(SpringBoot+Dubbo+Docker+Jenkins)...

    原文:手把手0基础项目实战(一)--教你搭建一套可自动化构建的微服务框架(SpringBoot+Dubbo+Docker+Jenkins)... 本文你将学到什么? 本文将以原理+实战的方式,首先对& ...

  7. 毫无基础的人入门Python,Python入门教程

    随着人工智能的发展,Python近两年也是大火,越来越多的人加入到Python学习大军,对于毫无基础的人该如何入门Python呢?这里整理了一些个人经验和Python入门教程供大家参考. 如果你是零基 ...

  8. 0基础算法基础学算法 第八弹 递归进阶,dfs第一讲

    最近很有一段时间没有更新了,主要是因为我要去参加一个重要的考试----小升初!作为一个武汉的兢兢业业的小学生当然要去试一试我们那里最好的几个学校的考试了,总之因为很多的原因放了好久的鸽子,不过从今天开 ...

  9. <-0基础学python.第一课->

    初衷:我电脑里面的歌曲很久没换了,我想听一下新的歌曲,把他们下载下来听,比如某个榜单的,但是一首一首的点击下载另存为真的很恶心 所以我想有没有办法通过程序的方式来实现,结果还真的有,而且网上已经有有人 ...

  10. [.net 面向对象编程基础] (13) 面向对象三大特性——多态

    [.net 面向对象编程基础] (13) 面向对象三大特性——多态 前面两节,我们了解了面向对象的的封装和继承特性,面向对象还有一大特性就是多态.比起前面的封装和继承,多态这个概念不是那么好理解.我们 ...

随机推荐

  1. 记一次单元测试问题com.sun.crypto.provider.HmacSHA1 cannot be cast to javax.crypto.MacSpi

    在用单元测试Junit测试部门的SDK时,有个md5鉴权步骤,出现了java.lang.ClassCastException: com.sun.crypto.provider.HmacSHA1 can ...

  2. JVM实战—9.线上FGC的几种案例

    大纲 1.如何优化每秒十万QPS的社交APP的JVM性能(增加S区大小 + 优化内存碎片) 2.如何对垂直电商APP后台系统的FGC进行深度优化(定制JVM参数模版) 3.不合理设置JVM参数可能导致 ...

  3. 在 .NET 中使用 Tesseract 识别图片文字

    1. 什么是 Tesseract Tesseract 是一个强大的字符识别 (OCR) 工具.它最初由 HP 发布,现在由 Google 和学术社区共同维护和开发. Tesseract 支持多种语言和 ...

  4. 循序渐进--从零开始建设k8s监控之alertmanager+发送飞书(三)

    前言 书接上文,prometheus已经安装好了,监控数据是有了,我们需要对其进行告警,并且可以发送到对应的平台,比如飞书.钉钉等,这里选择用飞书来测试 环境准备 组件 版本 操作系统 Ubuntu ...

  5. MySQL使用触发器禁止某行数据某些列的修改

    起因是有来线上演示环境的系统管理员账号经常被禁用导致登录不了,然后需要手动恢复数据状态才行. 原理是利用触发器的旧数据覆盖新数据 delimiter $ CREATE TRIGGER`sys_user ...

  6. GIMP 开源、免费,功能强大的图像编辑软件

    引言 万事开头难,打造个人网站,图片处理是必不可少的,老王的电脑还是 10 年前配置的,日常使用倒还流畅,但要是使用 Photoshop 就有些吃力,特别是越新的版本.然后,发现 GIMP 这个开源的 ...

  7. asp.net core 3.x 通用主机是如何承载asp.net core的-中

    便于理解直接录制视频了 必备知识: 依赖注入.配置系统.选项模式.推荐参考:A大博客 通用主机(参考:https://www.cnblogs.com/jionsoft/p/12154519.html) ...

  8. SequoiaDB数据库-new数据库

    随着企业中日益复杂与多变的需求,以及迅速扩展带来的海量数据的业务,IT部门需要将越来越多的信息提供给用户,同时在现今的全球经济背景环境下,IT部 门还需要在提供高效服务的同时,降低其设备与程序维护成本 ...

  9. iScroll4中事件点击一次却触发两次解决方案

    iScroll是我们在做手机网页中常用的滑动控件之一.单说其功能已相当丰富.但个别时候也是会掉坑的,正好这次就遇上了.在android的app中嵌入网页时不少手机会出现一次点击两次触发的现象.经过一段 ...

  10. 安装K8s集群

    因阿里云加速服务调整,镜像加速服务自2024年7月起不再支持,拉取镜像,下载网络插件等操作,需要国际联网访问DockerHub. 安装全过程均使用ROOT权限. 1.安装前准备工作 这里采用3台Cen ...