java和c++两种语言的多态对比(java选手转c++必学!)多态-保研机试,大厂面试必问

news/2024/9/11 3:36:28/ 标签: java, c++, 面试, 学习, 开发语言

多态(Polymorphism)是面向对象编程(OOP)中的一个重要概念,指的是同一个接口或基类在不同情况下可以表现出不同的行为。多态允许对象通过相同的接口或方法名以不同的方式执行操作,这种能力使代码更加灵活和可扩展。

java_2">java多态的主要形式

1.编译时多态(静态多态):

  • 方法重载(Method Overloading):在同一个类中,可以定义多个同名方法,但它们的参数类型、数量或顺序不同。编译器在编译时根据方法调用时传递的参数决定调用哪个方法。
  • 运算符重载(Operator Overloading):在某些编程语言中(如C++),允许开发者为类定义特定的操作符行为,使其适用于类的对象。
    示例(Java中的方法重载):
java">class Calculator {int add(int a, int b) {return a + b;}double add(double a, double b) {return a + b;}
}

上述代码中,同名方法 add 有两个不同的版本,编译器会根据参数类型选择调用哪个方法。

2.运行时多态(动态多态):

  • 方法重写(Method Overriding):子类可以重写(覆盖)父类的方法,使得子类对象在调用该方法时表现出不同的行为。运行时多态依赖于继承和接口,具体的方法调用在运行时决定。
    示例(Java中的方法重写):
java">class Animal {void sound() {System.out.println("Animal makes a sound");}
}class Dog extends Animal {@Overridevoid sound() {System.out.println("Dog barks");}
}class Cat extends Animal {@Overridevoid sound() {System.out.println("Cat meows");}
}

使用多态:

java">
public class Main {public static void main(String[] args) {Animal myDog = new Dog();Animal myCat = new Cat();myDog.sound(); // 输出: Dog barksmyCat.sound(); // 输出: Cat meows}
}

在上述代码中,myDog 和 myCat 都是 Animal 类型的引用,但它们在运行时调用的 sound 方法根据实际对象类型(Dog 或 Cat)表现出不同的行为。

多态的优点
代码复用:通过使用多态,可以编写更加通用和可重用的代码。
灵活性:程序可以在不修改现有代码的情况下扩展新的功能或行为。
可维护性:由于多态允许通过接口或基类来操作不同的对象,因此可以更轻松地修改和扩展代码。

c++多态的主要形式

在C++中,多态分为两种主要形式:

1.编译时多态(静态多态):

  • 函数重载(Function Overloading):类似于前面提到的Java中的方法重载,C++允许在同一个作用域中定义多个同名函数,但这些函数的参数列表必须不同。
  • 运算符重载(Operator Overloading):C++允许开发者为自定义类定义运算符,使得这些运算符可以用于类对象。
    示例(函数重载和运算符重载):
    ps 这个部分几乎和java相同!

class Example {
public:int add(int a, int b) {return a + b;}double add(double a, double b) {return a + b;}Example operator+(const Example& other) {Example result;// 假设有某种数据成员需要相加return result;}
};

2.运行时多态(动态多态):
虚函数(Virtual Function):C++中实现运行时多态的核心机制。通过在基类中定义虚函数,派生类可以重写这些虚函数,从而在运行时根据对象的实际类型调用相应的方法。

  • 注意点:
  • 父类中可继承函数必须用virtual来定义虚函数,派生类(子类)才能重写该函数
  • 声明派生类的时候必须用父类的指针!
Animal* myOtherAnimal = new Cat();
  • 表示继承的语句
class Dog : public Animal{
public:……}

代码示例(虚函数实现多态):


#include <iostream>
using namespace std;class Animal {
public:virtual void sound() {cout << "Animal makes a sound" << endl;}
};class Dog : public Animal {
public:void sound() override {cout << "Dog barks" << endl;}
};
//继承的基本语法!表示Animal类是cat的父类
class Cat : public Animal {
public:void sound() override {cout << "Cat meows" << endl;}
};int main() {
//注意 这个地方必须是指针!Animal* myAnimal = new Dog();Animal* myOtherAnimal = new Cat();myAnimal->sound();         // 输出: Dog barksmyOtherAnimal->sound();    // 输出: Cat meowsdelete myAnimal;delete myOtherAnimal;return 0;
}

在这个例子中,Animal类中的sound函数被声明为virtual,因此在Dog和Cat类中重写这个函数时,C++在运行时根据对象的实际类型调用适当的sound函数。

  • 多态的优点
    灵活性:允许使用基类指针或引用来操作派生类对象,代码更具扩展性。
    可扩展性:在不改变基类代码的情况下,可以扩展新的派生类,并使其融入现有的框架中。
    代码复用:通过继承和多态,可以重用代码并减少冗余。

总结

java和c++中多态的概念基本一致,都是分为编译时多态(同一接口,不同操作)和运行时多态(子类或派生类重写父类的方法),优点也是一致的,但是实现方法有区别


http://www.ppmy.cn/news/1508612.html

相关文章

【唐氏题目 nt题】与众不同

# 与众不同 ## 题目描述 A是某公司的CEO&#xff0c;每个月都会有员工把公司的盈利数据送给A&#xff0c;A是个与众不同的怪人&#xff0c;A不注重盈利还是亏本&#xff0c;而是喜欢研究「完美序列」&#xff1a;一段连续的序列满足序列中的数互不相同。 A想知道区间[L,R]之…

“头”和“段”里有什么? ——WEB开发系列04

作为前端开发人员&#xff0c;理解HTML的基本结构及语义是至关重要的。我们将继续深入探讨HTML中的标题&#xff08;​​<h1>​​到​​<h6>​​标签&#xff09;和段落&#xff08;​​<p>​​标签&#xff09;。 1. HTML文档结构回顾 在深入标题和段落之前…

芯片bring-up的测试用例

文章目录 前言一、测试用例的规划和编写原则1、冒烟测试1&#xff09;电源时钟复位测试2&#xff09;寄存器扫描测试3&#xff09;单一功能冒烟测试 二、遍历测试三、随机测试四、性能测试五、压力测试 总结 前言 最近做了一些用测试用例点亮芯片的工作&#xff0c;从测试用例…

LabVIEW电机测试系统

LabVIEW电机测试系统采用共直流母线架构&#xff0c;优化能量循环方式&#xff0c;实现内部能量循环。系统利用高精度仪器与先进软件技术&#xff0c;提供了一个高效、可靠的测试平台&#xff0c;适用于200 kW以下的交流异步电机和永磁同步电机的性能及耐久性测试。 项目背景 …

Unity读取Android外部文件

最近近到个小需求,需要读Android件夹中的图片.在这里做一个记录. 首先读写部分,这里以图片为例子: 一读写部分 写入部分: 需要注意的是因为只有这个地址支持外部读写,所以这里用到的地址都以 :Application.persistentDataPath为地址起始. private Texture2D __CaptureCamera…

OpenHarmony南向开发 SA服务SELinux权限配置一站式傻瓜式教程

Selinux权限配置 OpenHarmony中SELinux使用详解 目录 SELinux简介SELinux概念SELinux模式OH中SELinux使用详解新增SA服务如何配置SELinux权限SELinux简介 SELinux是Security Enhanced Linux 的缩写,也就是安全强化的 Linux,旨在增强传统Linux操作系统的安全性,解决传统Li…

单调队列《滑动窗口》

#include <iostream>using namespace std;const int N 100010;int m; int q[N], hh, tt -1;//hh表示队头&#xff0c;tt表示队尾int main() {cin >> m;while (m -- ){string op;int x;cin >> op;if (op "push"){cin >> x;q[ tt] x;//队…

Linux Vim教程(十五):使用Vimscript进行脚本编写

目录 1. Vimscript简介 2. 基本语法和结构 2.1 变量 2.2 条件语句 2.3 循环语句 2.4 函数 3. 操作缓冲区、窗口和标签页 3.1 缓冲区 3.2 窗口 3.3 标签页 4. 自动化编辑任务 4.1 自动命令 4.2 键映射 5. 编写和调试Vimscript脚本 5.1 编写脚本 5.2 调试脚本 6…

魔方远程时时获取短信内容APP 前端Vue 后端Ruoyi框架(含搭建教程)

前端Vue 后端Ruoyi框架 APP原生JAVA 全兼容至Android14(鸿蒙 澎湃等等) 前后端功能&#xff1a; ①后端可查看用户在线状态(归属地IP) ②发送短信(自定义输入收信号码以及短信内容&#xff0c;带发送记录) ③短信内容分类清晰(接收时间、上传时间等等) ④前后端分离以及A…

【AWS账号解绑关联】Linker账号解绑重新关联注意事项

文章目录 一、来自客户疑问二、提交工单获取帮助三、最佳操作说明四、最佳操作步骤五、参考资料活动上新 一、来自客户疑问 将Linker账号&#xff0c;从一个组织中退出&#xff0c;重新关联到新的组织中&#xff0c;这解绑到重新完成新的关联绑定期间会在Linker账号中的账单中…

力扣高频SQL 50题(基础版)第四十二题之1517.查找拥有有效邮箱的用户

文章目录 力扣高频SQL 50题&#xff08;基础版&#xff09;第四十二题1517.查找拥有有效邮箱的用户题目说明实现过程准备数据实现方式结果截图总结 力扣高频SQL 50题&#xff08;基础版&#xff09;第四十二题 1517.查找拥有有效邮箱的用户 题目说明 表: Users -----------…

Xcode自定义模板:提升开发效率的秘诀

Xcode自定义模板&#xff1a;提升开发效率的秘诀 引言 在iOS开发中&#xff0c;Xcode的自定义模板是一项强大的功能&#xff0c;它允许开发者根据自己的开发习惯和项目需求&#xff0c;创建个性化的代码和项目模板。这不仅可以加快开发速度&#xff0c;还能保持代码的一致性和…

C#使用Puppeteer

Puppeteer Puppeteer是一个Node.js库&#xff0c;它提供了高级API来通过DevTools协议(Chrome DevTools Protocol https://devtools.chrome.com)控制Chrome或Chromium。 Puppeteer默认情况下无头运行(headless)。 可以配置为运行完整的Chrome或Chromium&#xff0c;运行效果如…

oracle rac

1、app连接oracle rac集群 连接到 Oracle RAC&#xff08;Real Application Clusters&#xff09;的多种配置方式 1. 使用 JDBC 连接字符串&#xff1a; 使用 JDBC 连接字符串是连接 Oracle RAC 的常见方式。连接字符串的格式如下&#xff1a; jdbc:oracle:thin:(DESCRIPTION…

2024年8月7日(mysql主从 )

回顾 主服务器 [rootmaster_mysql ~]# yum -y install rsync [rootmaster_mysql ~]# tar -xf mysql-8.0.33-linux-glibc2.12-x86_64.tar [rootmaster_mysql ~]# tar -xf mysql-8.0.33-linux-glibc2.12-x86_64.tar.xz [rootmaster_mysql ~]# cp -r mysql-8.0.33-linux-glibc2.…

Docker基础知识大全

文章目录 前言一、Docker为什么出现&#xff1f;二、Docker历史三、Docker能干嘛&#xff1f;四、Docker名词五、Docker安装&#xff08;CentOS7&#xff09;六、卸载docker命令七、Docker镜像容器命令总结 1、Docker为什么出现&#xff1f; java jar包 打包项目带上环境&…

RabbitMq如何确保消息不丢失

问题&#xff1a;在生产环境中由于一些不明原因&#xff0c;导致 rabbitmq 重启&#xff0c;在 RabbitMQ 重启期间生产者消息投递失败&#xff0c;导致消息丢失&#xff0c;需要手动处理和恢复。于是&#xff0c;我们开始思考&#xff0c;如何才能进行 RabbitMQ 的消息可靠投递…

Linux驱动入门实验班——基础驱动模板(附百问网视频链接)

目录 一、GPIO子系统 1.确定引脚编号 2.写程序 二、中断函数 使用中断的流程 三、定时器 1.定时器两要素 2.使用定时器 四、交互流程解读 1、非阻塞访问和阻塞访问 2、POLL 3、异步通知 课程链接 一、GPIO子系统 如何驱动GPIO 1.确定引脚编号 可以在开发板上&a…

【网络基础一】几乎不讲任何网络协议细节,搭建网络基本结构

文章目录 问题认识“协议”计算机通信问题技术问题应用问题 协议分层那么网络分层应该怎么分层呢&#xff1f;网络传送宏观流程以太网通信 统编程帮助我们处理数据&#xff0c;网络编程帮助我们获取数据&#xff0c;网络配上我们写的线程池模块很快就搭建起来了。 问题 网卡是…

性能测试工具之JMeter

JMeter Apache JMeter应用程序是开源软件,是一个100%纯Java应用程序,旨在负载测试功能行为和衡量性能。它最初是为测试Web应用程序而设计的,但后来扩展到其他测试功能。 JMeter是一个免费、开源、跨平台的性能测试工具,于20世纪90年代后期面世。这是一个成熟、健全且具有…