3.4 C++多态

2023-10-27

        C++向上转型

1.派生类对象赋值给基类对象;

2.派生类指针赋值给基类指针;

        【单纯这样的使用,向上转型是不完整的】

        类型兼容原则

是指在需要基类对象的任何地方,都可以使用公有派生类的对象来替代。通过公有继承,派生类得到了基类中除构造函数、析构函数之外的所有成员。这样,公有派生类实际就具备了基类的所有功能,凡是基类能解决的问题,公有派生类都可以解决。类型兼容规则中所指的替代包括以下情况:

子类对象可以当作父类对象使用

子类对象可以直接赋值给父类对象

子类对象可以直接初始化父类对象

父类指针可以直接指向子类对象

父类引用可以直接引用子类对象

在替代之后,派生类对象就可以作为基类的对象使用,但是只能使用从基类继承的成员。

类型兼容规则是多态性重要基础之一。

总结:子类就是特殊的父类 (base *p = &child;),注意,构造函数默认为私有的,私有的方法和属性在子类中是不可以被继承的,在子类中是无法访问的。
 

        虚函数

(基类中的函数前加上 virtual)解决向上转型的完整性————向上转型后,可以使用基类的指针来访问派生类内的函数

前提:发生了函数遮蔽(覆盖)

工程意义:实现了多态

注意事项

1.基类中用virual 声明成员函数为虚函数,类外实现虚函数时,不必再加virtual
2.在派生类中重新定义此函数称为覆写,要求函数名,返值类型,函数参数个数及类型全部匹配
3.为了避免在派生类写错虚函数,可在派生类里的虚函数中添加
override修饰,确保该函数为虚函数并覆写来自基类的虚函数

        多态

        多态条件:

1.继承(并发生函数覆盖)

2.定义了虚函数

3.基类对象接受派生类对象无法产生多态;只有基类指针接受派生类指针和地址才能产生多态;

        多态分类:

静多态:函数重载;

动态多态:基类的指针;(地址只有程序运行时候,才会产生指针的地址)

        多态限制:

  1. 只有类的成员函数才能声明为虚函数;
  2. 静态成员函数不能是虚函数;
  3. 内联函数不能是虚函数
  4. 构造函数不能是虚函数
  5. 基类析构函数可以是虚函数且通常声明为虚函数

 

 

        new delete

使用类名后面加上括号表示调用默认的构造函数,以创建对象的实例。如果不加括号,则表示声明了一个指向类的指针,但并没有创建对象的实例。

在C++中,你可以使用new运算符来动态分配内存,
并创建一个类的实例,并将其地址分配给指针。
以下是定义一个指针指向一个类的示例代码:

class MyClass {
public:
    void myFunction() {
        // 实现函数的代码
    }
};

int main() {
    MyClass* ptr; // 声明一个指向 MyClass 类的指针

    ptr = new MyClass(); // 使用 new 运算符动态分配内存,并
创建一个 MyClass 对象,并将对象的地址赋给指针

    ptr->myFunction(); // 通过指针调用 MyClass 的成员函数

    delete ptr; // 使用 delete 运算符释放之前分配的内存

    return 0;
}
在上面的示例中,通过new MyClass()语句使用new运算符分配内存,
并创建了一个MyClass的对象,并将对象的地址赋值给指针ptr。
然后,可以使用指针访问该对象的成员函数和成员变量。
最后,使用delete运算符释放先前分配的内存,以避免内存泄漏。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

3.4 C++多态 的相关文章

  • WindowsError:[错误 126] 使用 ctypes 加载操作系统时

    python代码无法在Windows 7平台上运行 def libSO lib ctypes cdll LoadLibrary ConsoleApplication2 so lib cfoo2 1 3 当我尝试运行它时 得到来自python
  • 尝试了解使用服务打开对话框

    我已经阅读了有关使用 mvvm 模式打开对话框的讨论 我看过几个使用服务的示例 但我不明白所有部分如何组合在一起 我发布这个问题寻求指导 以了解我应该阅读哪些内容 以更好地理解我所缺少的内容 我将在下面发布我所拥有的内容 它确实有效 但从我
  • Environment.CurrentDirectory 与 System.IO.Directory.GetCurrentDirectory

    我正在编写一个 Net WinForms 并不断在调试和发布配置之间切换 并且有一些文件我需要任一配置才能访问 我想做的是将文件放在 BIN 文件夹中的公共目录中 这样它看起来像这样 MyProject Bin CommonFiles My
  • 转换 const void*

    我有一个函数返回一个const void 我想用它的信息作为char 我可以将它投射为 C 风格的罚款 char variable但是当我尝试使用reinterpret cast like reinterpret cast
  • 前向声明类型和“已声明为类类型的非类类型”

    我对以下代码有问题 template
  • 循环遍历 C 结构中的元素以提取单个元素的值和数据类型

    我有一个要求 我有一个 C 语言的大结构 由大约 30 多个不同数据类型的不同元素组成 typedef struct type1 element1 type2 element2 type3 element3 type2 element4 1
  • 当事件button.click发生时,如何获取按钮名称/标签?

    我以编程方式制作按钮并将它们添加到堆栈面板中 以便每次用户导航到页面时按钮都会发生变化 我正在尝试做这样的事情 当我单击创建的按钮时 它将获取按钮的标签并转到正确的页面 但是 我无法使用 RoutedEventHandler 访问按钮元素
  • 无法注册时间触发的后台任务

    对于 Windows 8 应用程序 在 C Xaml 中 我尝试注册后台任务 很难说 但我想我的后台任务已正确注册 但是当我单击调试位置工具栏上的后台任务名称时 我的应用程序停止工作 没有任何消息 我查看了事件查看器上的日志 得到 具有入口
  • 如何将 .txt 文件中的数据转换为 xml? C#

    我在一个文本文件中有数千行数据 我想通过将其转换为更容易搜索的内容来轻松搜索 我希望 XML 或其他类型的大型数据结构 尽管我不确定它是否是最好的对于我的想法 每行的数据如下所示 第 31 册 托马斯 乔治 32 34 154 每本书都不是
  • RestSharp获取序列化输出

    我正在寻找一种方法来访问 AddBody 调用的序列化结果 我正在使用内置的 RestSharp 序列化器 例子 class Foo public string FooField void SendRecord var f new Foo
  • 语音识别编程问题入门

    所以 你们可能都看过 钢铁侠 其中托尼与一个名为贾维斯的人工智能系统进行交互 演示剪辑here http www youtube com watch v Go8zsh1Ev6Y 抱歉 这是广告 我非常熟悉 C C 和 Visual Basi
  • 不同 C++ 文件中的相同类名

    如果两个 C 文件具有相同名称的类的不同定义 那么当它们被编译和链接时 即使没有警告也会抛出一些东西 例如 a cc class Student public std string foo return A void foo a Stude
  • 从 C# 使用 Odbc 调用 Oracle 包函数

    我在 Oracle 包中定义了一个函数 CREATE OR REPLACE PACKAGE BODY TESTUSER TESTPKG as FUNCTION testfunc n IN NUMBER RETURN NUMBER as be
  • C++ - 多维数组

    处理多维数组时 是否可以为数组分配两种不同的变量类型 例如你有数组int example i j 有可能吗i and j是两种完全不同的变量类型 例如 int 和 string 听起来您正在寻找 std vector
  • 如何在 C# 中创建异步方法?

    我读过的每一篇博客文章都会告诉您如何在 C 中使用异步方法 但由于某些奇怪的原因 从未解释如何构建您自己的异步方法来使用 所以我现在有这段代码使用我的方法 private async void button1 Click object se
  • 比较:接口方法、虚方法、抽象方法

    它们各自的优点和缺点是什么 接口方法 虚拟方法 抽象方法 什么时候应该选择什么 做出这一决定时应牢记哪些要点 虚拟和抽象几乎是一样的 虚方法在基类中有一个实现 可以选择重写 而抽象方法则没有 并且must在子类中被覆盖 否则它们是相同的 在
  • C++:为什么 numeric_limits 对它不知道的类型起作用?

    我创建了自己的类型 没有任何比较器 也没有专门化std numeric limits 尽管如此 由于某种原因 std numeric limits
  • EntityFramework 6.0.0.0 读取数据,但不插入

    我创建了一个基于服务的数据库 folderName gt Add New Item gt Data gt Service based Database文件到 WPF 应用程序中 然后我用过Database First方法并创建了Person
  • 没有“对 *this”功能的右值引用的解决方法

    我有一个围绕可移动对象的代理容器类 并希望代理能够隐式生成对底层对象的右值引用 但仅当代理本身被移动时 我相信我将能够按照提案 n2439 实施此行为 将移动语义扩展到 this http www open std org jtc1 sc2
  • 是否允许全局静态标识符以单个 _ 开头?

    换句话说 可能static 文件范围 全局变量恰好以一个下划线开头 而不会产生与 C 实现发生名称冲突的可能性 https www gnu org software libc manual html node Reserved Names

随机推荐

  • C++的STL库常用API--stack

    stack的简介 stack是堆栈容器 是一种 先进后出 的容器 stack是简单地装饰deque容器而成为另外的一种容器 stack使用之前的准备 include
  • 从Diffusion Model到score-based generative models再到Consistency Models的介绍

    从Diffusion Model到score based generative models再到Consistency Models的介绍 0 前言 图片介绍以PPT的形式 0 前言 完整的PPT在这 https download csdn
  • 大数据学习-bug03-HDFS web页面文件访问出错

    项目场景 学习HDFS时遇到的一个小问题 问题描述 当从本地上传文件 或者执行jar包完成的结果在终端界面可以查看其具体内容 但是在web页面无法查看 报错Couldn t preview the file 原因分析 1 hdfs site
  • 应用Apache Axis2 实现Webservice发布

    由于最近需要做webservice接口 所以google了一下 发现Apacle有个Axis2插件 一直觉得Apache的插件还是蛮好用的 于是决定应用Axis2来实现Webservice 第一次做webservice 呵呵有很多不懂的地方
  • 初识C语言之详解char类型

    文章目录 一 预备知识 二 char类型 三 声明与初始化 1 声明 2 字符常量和初始化 3 非打印字符 一 预备知识 字符的定义 字符指类字形单位或符号 包括字母 数字 运算符号 标点符号和其他符号 以及一些功能性符号 在C语言中 用单
  • 深度学习环境配置4——windows下的tensorflow-cpu=1.13.2环境配置

    深度学习环境配置4 windows下的tensorflow cpu 1 13 2环境配置 注意事项 一 2021 10 8更新 学习前言 环境内容 环境配置 一 Anaconda安装 1 Anaconda的下载 2 Anaconda的安装
  • vite + vue3 —— vue地图大屏项目

    回顾 前期 前端利器 提升 500倍开发效率 传一张设计稿 点击一建生成项目 好牛 0 活在风浪里的博客 CSDN博客如果非要说它有什么缺点 那么我觉得就是它会 让你cv大法都没处使 比如 公司让你写一个小程序 或h5web页面 UI给了你
  • GPT内功心法:搜索思维到GPT思维的转换

    大家好 我是herosunly 985院校硕士毕业 现担任算法研究员一职 热衷于机器学习算法研究与应用 曾获得阿里云天池比赛第一名 CCF比赛第二名 科大讯飞比赛第三名 拥有多项发明专利 对机器学习和深度学习拥有自己独到的见解 曾经辅导过若
  • UE4+Log日志

    虚幻引擎 4 22 VS 2017 将自定义的Log日志 存放到项目工程或者打包程序的Saved Logs目录下 1 创建一个C 空类 我命名为GunTestLog 2 GunTestLog h文件 Fill out your copyri
  • 关于Scroll的CSS属性--修改滚动条样式

    本文部分转载自 仅用于学习关于css中的那些scroll 炫意HTML5一 滚动轴scrollbar说到css中的scroll 我们最先想到的应该是overflow scroll 想到这个scroll之后 自然而然又想到了浏览器的滚动轴 说
  • STM32以太网通信-STM32F407与 DP83848 RMII硬件接口参考与注意事项

    主要参考 STM32F407和DP83848芯片RMII模式硬件电路图参考 常用元器件使用方法13 物理层接口芯片DP83848的使用方法 分享一下STM32F407和DP83848芯片RMII模式硬件电路图 电路原理图如上图所示 其中DP
  • C++无锁编程——无锁队列(lock-free queue)

    C 无锁编程 无锁队列 lock free queue 贺志国 2023 7 11 上一篇博客给出了最简单的C 数据结构 栈的几种无锁实现方法 队列的挑战与栈的有些不同 因为Push 和Pop 函数在队列中操作的不是同一个地方 同步的需求就
  • Python: 爬虫入门-python爬虫入门教程(非常详细)

    1 基本的爬虫工作原理 网络爬虫定义 又称Web Spider 网页蜘蛛 按照一定的规则 自动抓取网站信息的程序或者脚本 蜘蛛通过网页的链接地址来寻找网页 从网站某一个页面开始 读取网页的内容 找到网页中的其他链接地址 然后通过这些链接地址
  • poj 1742 Coins

    Problem poj org problem id 1742 Reference www cppblog com flyinghearts archive 2010 09 01 125555 html blog csdn net wang
  • 微信小程序多线程使用(含视频讲解、源码)

    简介 我们在开发微信小程序的时候 有时候会用到异步任务 如果把耗时任务放在主线程中 会导致主线程被阻塞 后面代码执行不了 界面会卡主 程序崩溃等问题 这时候就要用到多线程 来并发处理业务需求 工具 原料 微信开发者工具 微信小程序APPID
  • PAT——1035. 插入与归并

    根据维基百科的定义 插入排序是迭代算法 逐一获得输入数据 逐步产生有序的输出序列 每步迭代中 算法从输入序列中取出一元素 将之插入有序序列中正确的位置 如此迭代直到全部元素有序 归并排序进行如下迭代操作 首先将原始序列看成N个只包含1个元素
  • 读Qt示例之Modbus Master example(一)

    读Qt示例之Modbus Master example 一 本示例来自于Qt5 6 2 本篇主要看WriteRegisterModel这个模型类是怎么实现的 涉及知识点主要是model view中的model WriteRegisterMo
  • 金九银十:搞定这两个开源项目,30k轻松吧?

    又到了金九银十的招聘黄金季了 显然今年行情不怎么样 僧多粥少 而且招聘门槛也是越来越高 面试深度也越来越偏底层 动辄就是几道mid hard级别的算法题 做出来了说你Leetcode没少刷 没做出来就说你不行 就像我之前面试的时候 问我的我
  • SQL Server 关键字使用详解

    1 DISTINCT关键字 说明 用于返回唯一不同的值 语法 SELECT DISTINCT column name column name FROM table name 实例 选择用户的昵称并去重 选择用户的昵称并去重 SELECT D
  • 3.4 C++多态

    C 向上转型 1 派生类对象赋值给基类对象 2 派生类指针赋值给基类指针 单纯这样的使用 向上转型是不完整的 类型兼容原则 是指在需要基类对象的任何地方 都可以使用公有派生类的对象来替代 通过公有继承 派生类得到了基类中除构造函数 析构函数