C 怎么用c语言的函数指针实现封装、继承和多态

文章目录

    • 封装
    • 继承
    • 多态

封装

封装是把一个抽象的事物的属性以及对应的操作打包到一个类中,通过内部的方法来改变内部的状态,封装的本质是在隐藏信息,使得对象内部的状态不轻易被外界访问和利用。

但是c语言没有类的概念,c语言实现封装,可以使用结构体来实现。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct human{int age;char sex[10];void (*set_age)(struct human *p,int age);int (*get_age)(struct human *p);void (*set_sex)(struct human *p,char* sex);char* (*get_sex)(struct human *p);
}human;void set_age(human *p,int age){p->age=age;
}
int get_age(human *p){return p->age;
}void set_sex(human *p,char* sex){strcpy(p->sex,sex);//p->sex=sex;
}
char* get_sex(human *p){return p->sex;
}int main(){human p={18,"female",set_age,get_age,set_sex,get_sex};printf("年龄:%d\n",p.get_age(&p));printf("性别:%s\n",p.get_sex(&p));p.set_age(&p,19);p.set_sex(&p,"male");printf("年龄:%d\n",p.get_age(&p));printf("性别:%s\n",p.get_sex(&p));}

定义一个human的结构体,结构体具有两个属性为age和sex,有两组方法,分别为设置输入与获取的方法。

继承

继承是基于一个已有的类(父类),再创建一个新的类(子类),新的类可以访问父类的属性和动作,从而避免重复编写代码。需要注意的是,父类需要放在子类的数据结构的第一个数据成员。子类可以有自己的属性。

在c语言中,可以使用结构体嵌套的方法,实现类的继承(单继承)。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct human{int age;char sex[10];void (*set_age)(struct human *p,int age);int (*get_age)(struct human *p);void (*set_sex)(struct human *p,char* sex);char* (*get_sex)(struct human *p);
}human;typedef struct person{human p;char name[10];
}person;void set_age(human *p,int age){p->age=age;
}
int get_age(human *p){return p->age;
}void set_sex(human *p,char* sex){strcpy(p->sex,sex);//p->sex=sex;
}
char* get_sex(human *p){return p->sex;
}person * create_person(int age,char* sex, char* name){person* per=(person*)malloc(sizeof(person));per->p.age=age;strcpy(per->p.sex,sex);strcpy(per->name,name);return per;
}int main(){person* per;per=create_person(18,"male","Job");printf("年龄:%d\n性别:%s\n姓名:%s\n",per->p.age,per->p.sex,per->name);}

person继承了human中的两个属性,使用结构体的嵌套可以实现c语言的继承。

多态

多态是面向对象编程中最为核心的概念,它允许我们在不同的对象上执行相同的操作。

在c语言中,可以使用函数指针,利用同一个接口来处理不同的数据。具有不同的功能的函数可以使用同一个函数名,从而实现一个函数名调用不同的功能函数。

#include<stdlib.h>
#include<stdio.h>
#include<string.h>typedef struct{void (*draw)(void* shape);
}Shape;typedef struct{Shape base;int x;int y;int r;
}Circle;typedef struct{Shape base;int x1;int y1;int x2;int y2;
}Line;void drawCircle(void* shape){Circle* circle=(Circle*)shape;printf("Circle at(%d,%d)with radius %d\n",circle->x,circle->y,circle->r);
}void drawLine(void *shape){Line* line=(Line *)shape;printf("Line from(%d,%d)to(%d,%d)\n",line->x1,line->y1,line->x2,line->y2);
}int main(){int i=0;Circle circle={{drawCircle},0,0,1};Line line={{drawLine},0,0,1,1};Shape* shapes[2];shapes[0]=(Shape*)&circle;shapes[1]=(Shape*)&line;for(;i<2;i++) shapes[i]->draw(shapes[i]);return 0;
}

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

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

相关文章

axios和Ajax

1.axios 官网&#xff1a;https://axios-http.com/zh/ CDN&#xff1a;https://cdn.bootcdn.net/ajax/libs/axios/0.21.1/axios.min.js axios是一个请求库&#xff0c;在浏览器环境中&#xff0c;它封装了XHR&#xff0c;提供更加便捷的API发送请求 基本使用 // 发送 get 请求…

如何对非线性【SVM】进行三维可视化

首先导入相应的模块&#xff0c; from sklearn.datasets import make_blobs from sklearn.svm import SVC import matplotlib.pyplot as plt import numpy as np 我们使用make_circles()函数创建散点图&#xff0c;并将散点图中的点的横纵坐标赋值给x,y&#xff0c;其中x是特…

golang工程中间件——redis常用结构及应用(string, hash, list)

Redis 命令中心 【golang工程中间件——redisxxxxx】这些篇文章专门以应用为主&#xff0c;原理性的后续博主复习到的时候再详细阐述 string结构以及应用 字符数组&#xff0c;redis字符串是二进制安全字符串&#xff0c;可以存储图片等二进制数据&#xff0c;同时也可以存…

4、Python基本数据类型:数字、字符串、列表、元组、集合、字典

文章目录 1、Python基本数据类型简介2、数字3、字符串4、列表5、元组6、集合7、字典1、Python基本数据类型简介 Python是一种非常强大且易于学习的编程语言,它具有简洁的语法和丰富的数据类型。了解和掌握Python的基本数据类型是学习和使用Python的基础。本文将详细介绍Pytho…

react-app-env.d.ts是什么?

react-app-env.d.ts这个文件是使用CRA脚手架生成react项目时自动生成的&#xff0c;在平时的开发过程中看到这个文件就会感觉很疑惑&#xff0c;出于好奇心&#xff0c;在网上查找资料&#xff0c;得出下文 前置知识 这个是一个类型声明文件 它的内容很短&#xff0c;就一行…

ZYNQ_project:led

本次实验完成&#xff1a;led流水间隔0.5s 闪烁间隔0.25s。 名词解释&#xff1a; analysis分析&#xff1a;对源文件进行全面的语法检查。 synthesis综合&#xff1a;综合的过程是由 FPGA 综合工具箱 HDL 原理图或其他形式源文件进行分析&#xff0c;进而推演出由 FPGA 芯…

Blender vs 3ds Max:谁才是3D软件的未来

在不断发展的3D建模和动画领域&#xff0c;两大软件巨头Blender和3ds Max一直在争夺顶级地位。 随着技术的进步和用户需求的演变&#xff0c;一个重要问题逐渐浮出水面&#xff1a;Blender是否最终会取代3ds Max&#xff1f;本文将深入探讨二者各自的优势和劣势、当前状况&…

文件上传下载API

文件上传下载API 一、wx.uploadFile文件上传API二、wx.downloadFile文件下载API 微信小程序请求服务器地址需要在微信公众平台进行配置。 一、wx.uploadFile文件上传API wx.uploadFile(object)将本地资源上传到服务器&#xff0c;发起一个HTTP POST请求。其中content-type为mu…

linux命令screen解决client_loop: send disconnect: Broken pipe

一、SSH连接服务器&#xff0c;client_loop: send disconnect: Broken pipe 最近需要在服务器上运行一个需要跑很久的脚本&#xff0c;但ssh连接的远程服务器的命令窗口经常会报&#xff1a;client_loop: send disconnect: Broken pipe&#xff0c;这个错误是ssh 命令之后没有活…

python图像处理 ——图像分块

python图像处理 ——图像分块 前言一、分块与合并1.读取原始图像2.网格划分&#xff0c;将图像划分为m*n块3.网格合并 二、代码 前言 根据图像尺寸创建一个 ( m 1 ) ( n 1 ) 个均匀的网格顶点坐标&#xff0c;对于图像块来说每个图像块的左上角和右下角可以唯一确定一个图像…

react+canvas实现横跨整个页面的动态的波浪线(贝塞尔曲线)

本来写这个特效 我打算用css实现的&#xff0c;结果是一波三折&#xff0c;我太难了&#xff0c;最终没能用css实现&#xff0c;转战了canvas来实现。来吧先看效果图 当然这个图的波浪高度、频率、位置、速度都是可调的&#xff0c;请根据自己的需求调整&#xff0c;如果你讲波…

前端框架Vue学习 ——(六)Vue组件库Element

文章目录 Element 介绍快速入门常见组件表格分页Dialog 对话框组件表单 Container 布局容器 Element 介绍 Element&#xff1a;是饿了么团队研发的&#xff0c;一套为开发者、 设计师和产品经理准备的基于Vue 2.0的桌面端组件库。 组件&#xff1a;组成网页的部件&#xff0c;…

【Unity】2D角色跳跃控制器

最近加了学校的Nova独游社&#xff0c;本文是社团出的二面题&#xff0c;后续有时间优化下可能会做成一个二维冒险小游戏。本文主要涉及相关代码&#xff0c;参考教程&#xff1a;《勇士传说》横版动作类游戏开发教程 效果演示 【Unity】2D角色跳跃模拟器 主要实现功能&#xf…

CV计算机视觉每日开源代码Paper with code速览-2023.11.2

精华置顶 墙裂推荐&#xff01;小白如何1个月系统学习CV核心知识&#xff1a;链接 点击CV计算机视觉&#xff0c;关注更多CV干货 论文已打包&#xff0c;点击进入—>下载界面 点击加入—>CV计算机视觉交流群 1.【目标检测】Re-Scoring Using Image-Language Similarit…

Spring Boot 整合SpringSecurity和JWT和Redis实现统一鉴权认证

&#x1f4d1;前言 本文主要讲了Spring Security文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x1f304;每日一句&#xff1a;努力…

多功能声学综合馆:空间的“膜法师”

建筑是文明的承载者&#xff0c;是历史的见证者&#xff0c;也是城市的象征。但在现代都市中&#xff0c;我们不仅需要“固定”的建筑&#xff0c;更需要灵活与多功能性的空间。而这&#xff0c;正是多功能声学综合馆为我们带来的“膜法”。 不仅仅是建筑&#xff0c;更是艺术的…

【文末送书】【Java中的异常处理机制】提供常见的异常报错详情及其解决方案

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰…

【技术干货】开源库 Com.Gitusme.Net.Extensiones.Core 的使用

目录 1、项目介绍 2、为项目添加依赖 3、代码中导入命名空间 4、代码中使用 示例 1&#xff1a;string转换 示例 2&#xff1a;object转换 1、项目介绍 Com.Gitusme.Net.Extensiones.Core是一个.Net扩展库。当前最新版本1.0.4&#xff0c;提供了常见类型转换&#xff0c…

专精特新申报条件

&#xff08;一&#xff09;申报条件 申报企业须满足《山东省“专精特新”中小企业认定管理办法》&#xff08;鲁工信发〔2020〕7号&#xff09;所列条件。其中&#xff0c;企业近两年平均营业收入增速调整为不低于5%&#xff0c;其他条件不变。2018年认定的山东省“专精特新”…

Linux认证 | RHCA是什么等级的证书?考到工资能有多少?

RHCA就是红帽认证架构师&#xff0c;RHCA是红帽公司在红帽认证工程师&#xff08;RHCE&#xff09;和红帽认证技师&#xff08;RHCT&#xff09;认证推出之后又一个最新的顶级认证&#xff0c;在业界也是最受欢迎的、最成熟的linux认证。 那么RHCA是什么等级的证书&#xff1f…