C语言之封装,继承,多态
本文参考:
- c语言面向对象之封装
- c面向对象之继承
- Linux源码分析之多态
一、封装
封装的本质就是将数据和方法集中到一个对象中,c++或者java使用的是class来实现。c语言中可以使用struct来实现同样的功能。比如下面的程序:
struct student
{int age;char *name;void (*read)(char *);
};void read_book(char *book)
{printf("book is :%s", book);
}int main(void)
{struct student s1;s1.age = 10;s1.name = strdup("xiaoming");s1.read = read_book;printf("name: %s age: %d\n", s1.name, s1.age);s1.read("math");free(s1.name)return 0;
}
二、继承
继承可以让子类使用父类的资源,减少重复。父类可以是将子类的共同点抽象出来,提升代码层次。
如何使用c来实现同样的效果,首先肯定还是需要struct来构建父类和子类,同时如果要达到is a的效果,从内存空间来看,也就意味着父类占据了子类内存地址的最开始位置。所以,我们可以按照下面的方式来构造继承。
struct parent
{void (*func1)(void);
};struct child
{struct parent pt;void (*func2)(void);
};void test(struct parent *p)
{p->func1();
}int main()
{struct child cd;test((struct parent *)&cd);
}
三、多态
多态就是在程序运行时,父类指针可以根据具体的子类对象来执行不同的函数行为。c++中一般通过虚函数来实现。c实现多态主要是通过结构体和函数指针。
#include <stdio.h> // 定义基类
struct Shape
{ void (*draw)(struct Shape*);
};// 定义派生类
struct Circle
{ struct Shape shape; int radius;
};struct Rectangle
{ struct Shape shape; int width; int height;
};void drawCircle(struct Shape *shape)
{ printf("Drawing a circle...\n");struct Circle *circle = (struct Circle *)shape;printf("Circle radius is %d\n", circle->radius);
}void drawRectangle(struct Shape *shape)
{ printf("Drawing a rectangle...\n");struct Rectangle *rectangle = (struct Rectangle *)shape;printf("Rectangle width is %d\n", rectangle->width);printf("Rectangle height is %d\n", rectangle->height);
}int main()
{ struct Circle circle;circle.shape.draw = drawCircle;circle.radius = 10;struct Rectangle rectangle; rectangle.shape.draw = drawRectangle;rectangle.width = 10;rectangle.height = 20;struct Shape *shape;shape = (struct Shape *)&circle;shape->draw(shape);shape = (struct Shape *)&rectangle;shape->draw(shape);return 0;
}
在Linux内核中数量最多的就是驱动程序代码,因为硬件设备是多种多样的,每种设备都会有对应的驱动程序。Linux对上层的接口都是统一和抽象的,要保证相同的接口最终能够对应到特定的硬件设备,这就需要使用多态的技巧。
include/linux/i2c.h
这个结构体定义了不少函数指针,就是实现多态的关键struct i2c_driver {unsigned int class;/* Standard driver model interfaces */int (*probe)(struct i2c_client *, const struct i2c_device_id *);int (*remove)(struct i2c_client *);/* New driver model interface to aid the seamless removal of the* current probe()'s, more commonly unused than used second parameter.*/int (*probe_new)(struct i2c_client *);/* driver model interfaces that don't relate to enumeration */void (*shutdown)(struct i2c_client *);/* Alert callback, for example for the SMBus alert protocol.* The format and meaning of the data value depends on the protocol.* For the SMBus alert protocol, there is a single bit of data passed* as the alert response's low bit ("event flag").* For the SMBus Host Notify protocol, the data corresponds to the* 16-bit payload data reported by the slave device acting as master.*/void (*alert)(struct i2c_client *, enum i2c_alert_protocol protocol,unsigned int data);/* a ioctl like command that can be used to perform specific functions* with the device.*/int (*command)(struct i2c_client *client, unsigned int cmd, void *arg);struct device_driver driver;const struct i2c_device_id *id_table;/* Device detection callback for automatic device creation */int (*detect)(struct i2c_client *, struct i2c_board_info *);const unsigned short *address_list;struct list_head clients;bool disable_i2c_core_irq_mapping;
};
drivers/i2c/i2c-slave-eeprom.c
相关文章:
C语言之封装,继承,多态
本文参考: c语言面向对象之封装c面向对象之继承Linux源码分析之多态 一、封装 封装的本质就是将数据和方法集中到一个对象中,c或者java使用的是class来实现。c语言中可以使用struct来实现同样的功能。比如下面的程序: struct student {int…...

GO内存分配详解
文章目录 GO内存分配详解一. 物理内存(Physical Memory)和虚拟内存(Virtual Memory)二. 内存分配器三. TCMalloc线程内存(thread memory)页堆(page heap)四. Go内存分配器mspanmcachemcentralmheap五. 对象分配流程六. Go虚拟内存ArenaGO内存分配详解 这篇文章中我将抽丝剥茧,…...

每日Attention学习12——Exterior Contextual-Relation Module
模块出处 [ISBI 22] [link] [code] Duplex Contextual Relation Network for Polyp Segmentation 模块名称 Exterior Contextual-Relation Module (ECRM) 模块作用 内存型特征增强模块 模块结构 模块思想 原文表述:在临床环境中,不同样本之间存在息肉…...

为什么现在电销公司这么难?
现在电销公司普遍底薪就4000,员工要干的工作: 1、自己办卡、现在大部分人对隐私方面比较在意,一般电销公司还都需要自己身份证实名办卡,打几天又封号,有的人甚至被移动拉黑 2、天天打电话,遇见的什么人都…...
每天一个数据分析题(四百四十二)- 标签与指标
数据分析师在工作中常常会涉及两个概念:标签、指标,下面关于标签与指标的描述正确的是()? A. 指标通常可以量化,但是标签一般是不可量化的 B. 标签是用来定义、评价和描述特定事物的一种标准或方式 C. 指…...
[论文笔记] pai-megatron-patch Qwen2-72B/7B/1.5B 长文本探路
[论文笔记] Pai-megatron-patch cpu-offload 改到 Qwen2-CSDN博客 Pai-Megatron-Patch (mcore代码) 长文本限制: 开SP之后,72B能开到16K,7B能开到32K。 但是72B开16K,或者7B开32K时,如果训练时训练样本中有长文本的话,则还是会OOM。 code: 相对于原repo加了一些代…...

【SpringCloud】微服务远程调用OpenFeign
工作原理流程图 上代码 common中添加依赖: <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency><groupId>org.spri…...

MySQL零散拾遗(四)
聚合函数 聚合函数作用于一组数据,并对一组数据返回一个值。 常见的聚合函数:SUM()、MAX()、MIN()、AVG()、COUNT() 对COUNT()聚合函数的更深一层理解 COUNT函数的作用:计算指定字段在查询结果中出现的个数(不包含NULL值&#…...

大语言模型-检索测评指标
1. MRR (Mean Reciprocal Rank)平均倒数排名: 衡量检索结果排序质量的指标。 计算方式: 对于每个查询,计算被正确检索的文档的最高排名的倒数的平均值,再对所有查询的平均值取均值。 意义: 衡量…...
Zookeeper集群中节点之间数据是如何同步的
1.首先集群启动时,会先进行领导者选举,确定哪个节点是Leader,哪些节点是Follower和Observer 2.然后Leader会和其他节点进行数据同步,采用发送快照和发送Diff日志的方式 3.集群在工作过程中,所有的写请求都会交给Lead…...

HTTPServer改进思路2(mudou库核心思想融入)
mudou网络库思想理解 Reactor与多线程 服务器构建过程中,不仅仅使用一个Reactor,而是使用多个Reactor,每个Reactor执行自己专属的任务,从而提高响应效率。 首先Reactor是一种事件驱动处理模式,其主要通过IO多路复用…...
Kubernetes Secret 详解
Kubernetes Secret 是一种用于存储和管理敏感信息的对象,如密码、OAuth 令牌和 SSH 密钥等。使用 Secret 可以避免将机密数据直接放在 Pod 规约或容器镜像中,从而增加了应用程序的安全性。 Secret 的类型 Kubernetes 支持多种类型的 Secret,包括: Opaque:默认的…...

docker笔记4-部署
docker笔记4-部署 一、部署nginx二、部署Tomcat三、部署ESKibana3.1 部署ES3.2 部署kibana 一、部署nginx docker search nginx #搜索nginx的最新版本docker pull nginx #这里可以指定nginx版本,如果不指定,那么就拉取最新版本latestdocker run -d --na…...

有监督学习基础
基本概念 给定输入有为(x,y),其中x表示学习特征,y表示输出,m表示输入总数,有监督学习旨在根据输入建立能够预测可能输出的模型,大致可以分为回归和分类两种,代表可能输出是无限的或…...

揭开 AI 绘画提示词的神秘密码!
前言 ** 揭秘AI 绘画 ** 提示词的神秘密码 亲爱的朋友们,今天我们要一起探索 AI 绘画世界中那神秘的“密码”——提示词。 在 AI 绘画的奇妙领域里,提示词就像是一把神奇的钥匙,能够开启无尽的创意之门。它是我们与 AI 进行心灵对话的桥…...

macOS 10.15中屏蔽Microsoft Edge浏览器的更新提示
文章目录 1.效果对比2.安装描述文件3.停用描述文件4.高级操作(可选)参考文献 最近在macOS10.15系统,打开Microsoft Edge浏览器,每次打开都有个烦人的提示“ 要获取将来的 microsoft edge 更新,需要 macos 10.15 或更高…...
Qt 实战(3)数据类型 | 3.2、QVariant
文章目录 一、QVariant1、存储数据1.1、存储Qt内置数据1.2、存储自定义数据 2、获取数据3、判断数据类型4、清空数据5、总结 前言: QVariant是Qt框架中一个非常强大且灵活的类,它提供了一种通用的方式来存储和转换几乎任何类型的数据。无论是基本数据类型…...
Docker中安装的postgresql14在启用vector扩展的时候,找不到该扩展的控制文件。
ERROR: could not open extension control file “/usr/share/postgresql/14/extension/vector.control”: No such file or directory 进入容器 docker exec -it CONTAINER ID /bin/bash 1.更新 apt-get apt-get update 2.安装插件 #不同版本对应修改数字即可 apt-get i…...

JS防抖和节流
一、防抖和节流的适用场景 防抖(Debounce): 适合在输入框输入时的实时搜索、窗口大小调整时的resize事件等。节流(Throttle): 适合如页面滚动时的scroll事件、按钮点击时的请求发送等需要控制频率的场景。 …...

OpenWrt 为软件包和docker空间扩容
参考资料 【openwrt折腾日记】解决openwrt固件刷入后磁盘空间默认小的问题,关联openwrt磁盘扩容空间扩容【openwrt分区扩容】轻松解决空间可用不足的尴尬丨老李一瓶奶油的YouTube 划分空间 参考一瓶奶油的YouTube 系统 -> 磁盘管理 -> 磁盘 -> 修改 格…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...

无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...

如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...

初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
鸿蒙(HarmonyOS5)实现跳一跳小游戏
下面我将介绍如何使用鸿蒙的ArkUI框架,实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...