C++:多态二

news2024/9/20 14:43:35

在面向对象方法中,所谓多态性就是不同对象收到相同消息产生不同的行为。在C++程序设计中,多态性是指用一个名字定义不同的函数,这些函数执行不同但又类似的操作,这样就可以用同一个函数名调用不同内容的函数。换言之,可以用同样的接口访问功能不同的函数,从而实现“一个接口,多种方法”

在C++中,多态性的实现和联编(也称绑定)这一概念有关。一个源程序经过编译、链接,成为可执行文件的过程是把可执行代码联编(或称装配)在一起的过程。其中在运行之前就完成的联编成为静态联编(前期联编);而在程序运行之时才完成的联编叫动态联编(后期联编)

静态联编支持的多态性称为编译时多态性(静态多态性)。在C++中,编译时多态性是通过函数重载和模板实现的。利用函数重载机制,在调用同名函数时,编译系统会根据实参的具体情况确定索要调用的是哪个函数。

动态联编所支持的多态性称为运行时多态(动态多态)。在C++中,运行时多态性是通过虚函数来实现的。

再举一个通俗易懂的例子:比如买票这个行为,普通人买是全价;学生买是半价票等。

二.多态的定义及实现
1.重写/覆盖 的要求
重写/覆盖: 子类中有一个跟父类完全相同的虚函数,子类的虚函数重写了基类的虚函数
即:子类父类都有这个虚函数 + 子类的虚函数与父类虚函数的 函数名/参数/返回值 都相同 -> 重写/覆盖(注意:参数只看类型是否相同,不看缺省值)

2.多态两个要求:

 1、被调用的函数必须是虚函数,子类对父类的虚函数进行重写 (重写:三同(函数名/参数/返回值)+虚函数)
 2、父类指针或者引用去调用虚函数

3.多态的切片示意图
(1)示例1:给一个student的子类对象(临时对象也行),然后把这个对象赋给一个父类指针,通过这个父类指针就可以访问student子类的虚拟函数

(2)示例2:假设B是子类,A是父类,new一个B类的临时对象,然后把这个临时对象赋给一个父类指针A* p2,通过这个父类指针p2就可以访问子类B的虚拟函数func

 

 
class A
{
public:
    virtual void func(int val = 1){ std::cout << "A->" << val << std::endl; }
    virtual void test(){ func(); }
};
 
class B : public A
{
public:
    void func(int val = 0){ std::cout << "B->" << val << std::endl; }
};
 
int main(int argc, char* argv[])
{
    B*p1 = new B;
    //p1->test();    这个是多态调用,下有讲解 二->6
    p1->func();    //普通调用
 
    A*p2 = new B;
    p2->func();    //多态调用
 
    return 0;
}

4.多态演示:
class Person {
public:
    Person(const char* name)
        :_name(name)
    {}
 
    // 虚函数
    virtual void BuyTicket()
    { 
        cout << _name << "Person:买票-全价 100¥" << endl;
    }
 
protected:
    string _name;
    //int _id;
};
 
class Student : public Person {
public:
    Student(const char* name)
        :Person(name)
    {}
 
    // 虚函数 + 函数名/参数/返回值 -》 重写/覆盖
    virtual void BuyTicket() 
    { 
        cout << _name << " Student:买票-半价 50 ¥" << endl; 
    }
};
 
void Pay(Person& ptr)
{
    ptr.BuyTicket();
}
 
int main()
{
        string name;
        cin >> name;
        Student s(name.c_str());
        Pay(s);
}

2.多态的定义和实现

2.1 多态定义构成条件

那么在继承中要构成多态还需要两个条件:
a. 调用函数的对象必须是指针或者引用
b. 被调用的函数必须是虚函数,且完成了虚函数的重写。

什么是虚函数?
虚函数:在类的成员函数前加virtual关键字。

class Person
{
   
public:
    virtual void BuyTicket()
    {
   
        cout << "买票-全价" << endl;
    }
};
 

什么是虚函数的重写?
虚函数的重写:派生类中有一个跟基类的完全相同的虚函数,我们就称子类的虚函数重写了基类的虚函数。“完全相同”是指:函数名、参数、返回值都相同。另外,虚函数的重写也叫做虚函数的覆盖。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1987162.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

虚拟机ubuntu22.04找不到ttyUSB*端口

问题描述&#xff1a; 在虚拟机上运行Ubuntu22.04&#xff0c;使用 ls /dev/ttyUSB* 发现查不着不到相关的端口文件。 排查问题及解决办法&#xff1a; 问题1&#xff1a;排查数据线是否只是单纯的充电线&#xff0c;单纯充电线无法进行数据传输&#xff0c;需要替换为数据…

怎么申请IP SSL证书?

申请 IP SSL 证书的过程通常涉及以下几个步骤。下面是一个概括性的指南&#xff0c;具体细节可能会根据不同的证书颁发机构&#xff08;CA&#xff09;而有所不同。以下步骤是基于 JoySSL 的流程&#xff0c;但大部分 CA 的申请流程都会有类似的要求&#xff1a; 1、确认IP地址…

介绍一个基于Ring 3 的rootkit

首先先科普用户态内核态 两者的在指令上的区别 一般来说&#xff0c;ring0权限下开放的指令有&#xff1a;IO读写、网卡访问、申请内存、访问硬件资源。 一般来说&#xff0c;ring3权限下开放的指令有&#xff1a;普通的计算指令等 两者在空间权限的区别 用户态和内核态…

装修装饰行业4G/5G无线视频监控技术方案

目录 一、引言 二、技术优势 三、系统方案设计 1、系统架构 2、监控前端 3、监控中心 四、系统功能 1、基本功能 &#xff08;1&#xff09;实时视频监控 &#xff08;2&#xff09;录像存储回放 &#xff08;3&#xff09;报警联动 &#xff08;4&#xff09;语音…

超越sd3!比肩Midjourney-v6?AI绘画大模型FLUX1.0详细评测与本地部署方法(附安装文件)

​ FLUX.1模型是什么&#xff1f; FLUX模型是一个开源的AI图像生成模型&#xff0c;由黑森林工作室研发。 堪比sd3以及Midjourney-v6 背景/backdrop 黑森林工作室&#xff08;Black Forest Labs&#xff09;由前Stability AI核心成员团队成立&#xff0c;专注于开发高级生成式…

脚本:自动生成精准的Oracle AWR报告

很多朋友把AWR报告发过来让我帮忙分析Oracle数据库的性能&#xff0c;但很多报告都有一个共同的缺陷&#xff1a;就是这些报告覆盖的时间范围太广&#xff0c;导致性能问题的数据被严重稀释。 英文原文&#xff1a;Script: Generating Focused AWR Reports 为了解决这个问题&a…

多模态大模型 intern_vl 2.0版本解读

目录 更大规模的语言模型 多模态输入 多任务输出 性能表现 github:GitHub - OpenGVLab/InternVL: [CVPR 2024 Oral] InternVL Family: A Pioneering Open-Source Alternative to GPT-4o. 接近GPT-4o表现的可商用开源多模态对话模型 论文&#xff1a;https://arxiv.org/pdf…

TypeScript循环2

循环2 for(开始条件&#xff0c;结束条件&#xff0c;变量更新){} for使程序能够重复执行某段代码&#xff0c;直至满足特定条件为至。 // 打印1~100for(let i:number0;i<100;i){console.log(i);}死循环,程序中要避免出现 即使需要你使用&#xff0c;也需要有退出条件 …

Windows系统cmd黑窗口cd命令不起作用的解决办法

一般这种情况是通过win r 输入cmd唤起得窗口是在c盘&#xff0c;而想切换到其他磁盘目录却发现命令并不生效&#xff0c;例如&#xff1a; 解决的办法就是先切换磁盘&#xff0c;再cd到文件夹目录&#xff0c;比如我切换到E盘&#xff0c;就是E&#xff1a; 然后再cd目标目录…

探索Linux世界之Linux环境开发工具的使用

一、yum -- Linux软件包管理器 1、什么是yum yum(Yellow dog Updater, Modified)&#xff1a; 是Linux下非常常用的一种包管理器. 主要应用在Fedora, RedHat, Centos等发行版上。 在Linux上安装软件的方式&#xff1a; 源代码直接安装&#xff1a;在Linux下安装软件, 一个通…

存储实验:FC-SAN实验与光交配置(GUICLI)

目录 目的环境介绍拓扑环境规划环境解释 实验流程0. FC-SAN存储 WWN查看1. FC-SAN业务主机&#xff08;linux&#xff09;配置1.1 IP配置1.2 查看wwn号 2. 光交配置2.1 GUI2.1.1 跳板机配置2.1.1.1 配置IP2.1.1.2 安装jdk2.1.1.3 浏览器登录光交IP 2.1.2 光交-Alias配置2.1.2.0…

【目标检测类】YOLOv5网络模型结构基本原理讲解

1. 基本概念 YOLOv5模型结构主要包括以下组成部分&#xff1a;‌ 输入端&#xff1a;‌YOLOv5的输入端采用了多种技术来增强模型的性能&#xff0c;‌包括Mosaic数据增强、‌自适应锚框计算、‌以及自适应图片缩放。‌这些技术有助于提高模型的泛化能力和适应不同尺寸的输入图…

springboot+vue+mybatis汽车租赁管理+PPT+论文+讲解+售后

汽车租赁系统是针对目前汽车租赁管理的实际需求&#xff0c;从实际工作出发&#xff0c;对过去的汽车租赁管理系统存在的问题进行分析&#xff0c;完善客户的使用体会。采用计算机系统来管理信息&#xff0c;取代人工管理模式&#xff0c;查询便利&#xff0c;信息准确率高&…

Unity补完计划 之 SpriteRender

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正 1.SpriteRenderer是什么 渲染精灵用的&#xff0c;是渲染的核心组件&#xff0c;有许多重要参数所以要详细讲一讲 Spri…

大语言模型VRAM估算指南和工具介绍

为了有效地执行大型语言模型(LLM)推理&#xff0c;了解GPU VRAM需求至关重要。VRAM对于存储模型参数、激活、处理批量大小和精度设置至关重要。估算VRAM使用情况的基本公式是:参数数(精度/ 8) 1.2。现代优化技术和框架可以进一步减少VRAM的需求。像VRAM Estimator, Hugging Fac…

Harbor 仓库一键安装

文章目录 一、场景说明二、脚本职责三、参数说明四、操作示例五、注意事项 一、场景说明 本自动化脚本旨在为提高研发、测试、运维快速部署应用环境而编写。 脚本遵循拿来即用的原则快速完成 CentOS 系统各应用环境部署工作。 统一研发、测试、生产环境的部署模式、部署结构、…

H5页面返回时提示用户返回将丢失信息

效果图 代码&#xff0c;组件封装弹窗 <template><div><van-popup v-model"show" :close-on-click-overlay"false" class"popup"><div class"content"><div class"title">提示:</div>…

QT学生管理系统 开发文档

目录 第一章 UI界面设计与开发 登录界面 主界面 UI美化 第二章 数据库设计与开发 数据库设计 连接数据库 数据库功能设计 sql语句设计 查询所有学生数量 查询第几页学生数据 删除学生 修改学生信息 清空学生表 添加单个用户 删除单个用户 修改用户权限 查询所有用户…

常用API_2:应用程序编程接口:ArrayList

文章目录 ArrayList常用方法 案例 &#xff1a;上菜 ArrayList 常用方法 来自黑马程序员学习视频 案例 &#xff1a;上菜 待完善

只有ip没有域名怎么申请证书?

当只有IP地址而没有域名时&#xff0c;仍然可以申请SSL证书以确保通过该IP地址访问的网站或服务的安全性。以下是为IP地址申请SSL证书的一般步骤&#xff1a; 一、确认前提条件 拥有公网IP地址&#xff1a;确保你拥有的是一个公网IP地址&#xff0c;因为内网IP地址不支持签发…