C++_多态(函数指针)

多态

  • 介绍
    • 虚函数
    • 覆盖(重写)
    • 多态
    • 源码
    • 运行结果
  • 笔记扩充(函数指针源码)

介绍

本文主要介绍 多态这个概念
(PS:多态只是一种概念形式)

虚函数

1.成员函数前 加上关键词 virtual ,该函数称为虚函数
(PS:static函数除外)
2.虚函数 按照实际 函数类型调用
(PS:如果基类中 有与 子类中有一模一样的函数,则 基类指针 会调用 子类中函数)

覆盖(重写)

1.只要基类中带有 virtual 关键词且 子类中函数 与 基类中函数的类型 函数名 参数一致
(PS:则子类中函数也是 虚函数 并且形成 覆盖)

  • 覆盖的条件
    1.必须是非静态成员函数
    2.基类使用 virtual
    3.子类函数 与 基类函数 原型严格相同

多态

1.子类提供了 对 基类虚函数的有效覆盖,通过 指向子类对象的 基类指针,或者 引用子类对象的 基类引用,调用该虚函数,实际调用结果为 子类覆盖版本,而非基类中原始版本
2.一般函数调用是通过 调用对象类型 决定,而多态这是通过调用者指针或引用的 实际目标对象的类型决定。
3.多态 只能通过 引用或指针 表现且指针更灵活
4.除 构造和析构函数,通过 基类中this指针 可满足多态

  • 多态的优点
    1.应用程序不必为每一个 子类 编写功能调用,只需要对抽象基类进行处理即可,大大提高程序的可复用性。
    2.子类的功能可以被 基类的指针或者引用变量 所调用,这叫向后兼容,可以提供可扩充性和可维护性。

源码

#include<iostream>
#include<string>using namespace std;class Animal
{
public://单参构造Animal(string name):m_name(name){}//说话函数(加上虚继承)virtual void say(){cout << m_name << ":say" << endl;}
protected:string m_name;
};class Dog :public Animal
{
public://单参构造Dog(string name) :Animal(name){}//说话函数void say(){cout << m_name << ":汪汪汪" << endl;}};
void main()
{//Animal 类构造Animal* p = new Animal("动物");//打印说话函数p->say();delete p;//销毁 new空间//Dog 类构造Dog* pd = new Dog("狗");pd->say();//优先调用当前类中的say();(PS:俗称 同名隐藏原则)//基类指针 指向子类对象p = new Dog("狗");//PS:只有以public方式继承才能使用 基类指针p->say();//调用子类中的say();(PS:俗称 覆盖)//基类对象构造Animal a = *p;//此处相当于只重写构造了一个基类,并没有使用到子类对象a.say();//输出为基类对象函数system("pause");
}

运行结果

动物:say
狗:汪汪汪
狗:汪汪汪
狗:say
请按任意键继续. . .

笔记扩充(函数指针源码)

#include<iostream>
#include<string>
using namespace std;
int add(int x, int y){ return x + y; } //加函数int sub(int x, int y){ return x - y; } //减函数int mul(int x, int y){ return x * y; }//乘函数int divi(int x, int y){ return x / y; }//除函数//通过 函数指针(PS:int(*fun)(int, int)) 形式 实现多态效果
int calc(int x, int y, int(*fun)(int, int)){ return fun(x, y); }
//主函数
int main()
{cout << "add结果:" << calc(1, 2, add) << endl;cout << "sub结果:" << calc(5, 2, sub) << endl;cout << "mul结果:" << calc(9, 2, mul) << endl;cout << "divi结果:" << calc(12, 2, divi) << endl;system("pause");return 0;
}

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

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

相关文章

vite+vue3创建项目及开发常见的问题

创建项目 1、npm create vitelatest 下一步&#xff0c;选vue 下一步&#xff0c;选typescript 成功&#xff1b; 2、进入项目&#xff0c;npm install 手动安装vue和vite相关的依赖包&#xff1b; 3、npm run dev 运行项目 常见问题 1、dev run dev 运行项目时&#xff0c;…

U盘启动安装win11遇到缺少计算机所需的介质驱动程序问题

一、使用U盘制作启动盘遇到问题 下载了windows原版镜像&#xff0c;验证了md5&#xff0c;确保文件没有损坏。使用ultroiso制作u盘启动盘&#xff0c;开始安装后出现下图的报错&#xff1a; 在网上搜索解决方案&#xff0c;主要有以下几种&#xff1a; 安装的时候&#xff0c…

MySQL 8.0 InnoDB Tablespaces之Temporary Tablespaces(临时表空间)

文章目录 MySQL 8.0 InnoDB Tablespaces之Temporary Tablespaces&#xff08;临时表空间&#xff09;会话临时表空间会话临时表空间的磁盘分配和回收会话临时表空间的创建创建临时表和查看临时表信息会话临时表空间相关的设置参数innodb_temp_tablespaces_dir 全局临时表空间查…

leetcode 每日一题 2024年01月09日 字符串中的额外字符

题目 字符串中的额外字符 给你一个下标从 0 开始的字符串 s 和一个单词字典 dictionary 。你需要将 s 分割成若干个 互不重叠 的子字符串&#xff0c;每个子字符串都在 dictionary 中出现过。s 中可能会有一些 额外的字符 不在任何子字符串中。 请你采取最优策略分割 s &…

Tensorflow2.0笔记 - 修改形状和维度

本次笔记主要使用reshape&#xff0c;transpose&#xff0c;expand_dim&#xff0c;和squeeze对tensor的形状和维度进行操作。 import tensorflow as tf import numpy as nptf.__version__#tensor的shape和维数获取 #假设下面这个tensor表示4张28*28*3的图片 tensor tf.rando…

【我的RUST库】get_local_info 0.2.1发布

get_local_info是一个获取linux本地信息的Rust三方库&#xff0c;其目标是降低获取本地linux系统信息的难度。支持银河麒麟10、UOS、鸿蒙等国产系统。 项目维护&#xff1a;长期 当前功能&#xff1a; 1.网络功能 1.1.获取网络接口信息 1.2 获取活动网卡信息&#xff1a;网…

延时任务的解决方案

延时任务的解决方案 1.数据库轮询2. JDK的延迟队列3.netty时间轮算法4.使用消息队列 1.数据库轮询 该方案通常是在小型项目中使用&#xff0c;即通过一个线程定时的去扫描数据库&#xff0c;通过订单时间来判断是否有超时的订单&#xff0c;然后进行update或delete等操作 代码示…

面试题-回溯算法解法模板

常见的回溯算法面试题 电话号码的字母组合 组合 全排列 组合总和 回溯算法解题模板 对于用回溯解决的题目&#xff0c;代码大部分可以用下面的模板来套&#xff1a; void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择&#xff1a;本层集合中元素&…

C++核心编程——类和对象(二)

本专栏记录C学习过程包括C基础以及数据结构和算法&#xff0c;其中第一部分计划时间一个月&#xff0c;主要跟着黑马视频教程&#xff0c;学习路线如下&#xff0c;不定时更新&#xff0c;欢迎关注。 当前章节处于&#xff1a; ---------第1阶段-C基础入门 ---------第2阶段实战…

[ctf.show 元旦水友赛 2024] crypto

感觉半个多月回家没有打开过电脑了。看到ctf.show上元旦的比赛&#xff0c;才想起似乎应该看看。 月月的爱情故事 上来这就是个小脑洞题&#xff0c;给了一大段文字和一个base64的串。并且提示&#xff1a;试试摩斯吧&#xff01; 从文字上看只有三种标点符号&#xff0c;显…

基于汽车胎压检测及温度预警

课题简介 汽车胎压监测系统可分为两种&#xff1a;一种是间接式胎压监测系统&#xff0c;是通过轮胎的转速差来判断轮胎是否异常&#xff1b;另一种是直接式胎压监测系统&#xff0c;通过在轮胎里面加装四个胎压监测传感器&#xff0c;在汽车静止或者行驶过程中对轮胎气压和温…

SwiftUI之深入解析布局协议

一、什么是布局协议&#xff1f; 采用布局协议类型的任务&#xff0c;是告诉 SwiftUI 如何放置一组视图&#xff0c;需要多少空间。这类型常常被作为视图容器&#xff0c;虽然布局协议是 2022 年新推出的&#xff08;至少公开来说&#xff09;&#xff0c;但是我们在第一天使用…

国内外十大语言模型横向对比测评(截至2023.12.8)

主要参考资料&#xff1a; B站Up主贯一智能科技《国内外十大语言模型之横向对比测评》 现在有非常多的开源测试数据集&#xff0c;比如MMLU、AGIEval、CEval 但是根据Up主描述比较费时成本高&#xff0c;其次这类标准化评测更多考察模型在各个学科和领域的综合表现&#xff0c;…

线性代数:由矩阵 AB=A 可以推出 B=E 吗?

其实&#xff0c;类似的问题在十几年前的各种提问中就出现了&#xff0c;而且&#xff0c;根据 A B A A BA ABA 推出 B E BE BE 有时候也相当 "符合直觉”&#xff0c;但如果追根问底&#xff0c;矩阵 B B B 到底应该是什么样子的&#xff0c;却很少有详细的解答。 …

QML使用QCustomPlot笔记

这里在QML中使用QCustomPlot是定义一个继承自QQuickPaintedItem的类&#xff0c;它包含一个QCustomPlot对象&#xff0c;在paint函数中将这个对象转化为pixmap绘制到布局中显示。 在QML中使用QT的Widget控件也可以借鉴这个思路实现 顺便记录一下QCustomPlot的简单设置与使用。…

Docker的介绍及安装基本操作命令

前言 Docker 是一个开源的应用容器引擎&#xff0c;基于 Go 语言 并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。 容器是完全使用沙箱…

C中分支和循环语句相关练习题

目录 &#xff08;1&#xff09;编写程序数一下1-100的所有整数中出现多少个数字9 (2)计算1/1-1/21/3-1/4......1/99-1/100的值&#xff0c;打印结果 (3)求十个整数中的最大值 &#xff08;4&#xff09;在屏幕上输出九九乘法口诀表 &#xff08;5&#xff09;二分查找元素 …

超声波模块驱动代码(CS100A芯片)

CS100A.c #include "CS100A.h"TIM_HandleTypeDef TimHandle;uint16_t CS100A_count0; //定时器中断中累加计数 float CS100A_distance0; //计算超声波测得的距离,单位为cm float err15/15.98; //调整误差系数&#xff0c;由于各种原因会出…

Hive 数据同步

一、需求 同步集团的数据到断直连环境。 二、思路 三、同步数据&#xff08;方案&#xff09; 1、环境&#xff1a;断直连模拟环境 2、操作机器&#xff1a;ETL 机器 XX.14.36.216 3、工作路径&#xff1a;cd /usr/local/fqlhadoop/hadoop/bin 4、执行命令&#xff1a; 命令…

H264码流进行RTP包封装

一.H264基本概念 H.264从框架结构上分为视频编码层&#xff08;VCL&#xff09;和网络抽象层&#xff08;NAL&#xff09;&#xff0c;VCL功能是进行视频编解码&#xff0c;包括运动补偿预测&#xff0c;变换编码和熵编码等功能&#xff1b;NAL用于采用适当的格式对VCL视频数据…