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

C语言模式实现C++继承和多态 C语言模式实现C++继承和多态 描述: C实现一个struct A和struct B各包含一个int成员a和b,要求达到B继承了A的效果,也就是B里面包含一个A。并且能达 到多态的效果,也就是一个A*p指向A调的是A的函数,指向B调用的是B的函数。 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;
}
C语言是怎样实现封装、继承、多态的? 我们都知道封装、继承、多态是c++面向对象中的基本特征。C语言是面向过程的语言,自身没有这些特性,那如何使用C语言来模拟C++的封装、继承、多态等面向对象的基本特征。下面就要讨论一下封装、继承、多态等面向对象在c语言中是如何实现的。 一、封装      封装:C++中的封装是利用public,protected、private来进行实现的,来隐藏一些不想让别人能够看到的一些东西,只留一些接口给 阅读详情

相关推荐

如何用C语言实现OOP

我们知道面向对象的三大特性分别是:封装、继承、多态。很多语言例如:C++ 和 Java 等都是面向对象的编程语言,而我们通常说 C 是面向过程的语言,那么是否可以用 C 实现简单的面向对象...

编程与实战的博客 2143

QT封装的指针

C/C++程序员来讲,内存泄露是需要特别关注的点,但是QT提供智能指针,可以避免由于使用原生指针(忘记释放堆上内存)而带来的内存泄露。

weixin_44764579的博客 657

Zynq裸机调试RTL8211FS网卡踩坑记:从ping不通到完美兼容的完整代码修改

本文详细记录了在Zynq平台上使用Xilinx SDK(XSDK)调试RTL8211FS网卡的完整过程,从最初的ping不通问题到最终实现完美兼容的解决方案。通过分析PHY芯片的寄存器配置差异,提供了关键代码修改和调试技巧,帮助开发者快速解决类似问题。

weixin_42550597的博客 420

【C++】C语言实现继承和多态

文章目录一、C语言实现继承二、C语言实现多态(1)静态多态(2)动态多态 一、C语言实现继承 原理:结构体组合类 //基类 typedef struct Base { //基类自身属性和方法 int b_val = 0; void show() { printf("b_val:%d\n", b_val); } }Base; typedef struct Son { //隐藏基类对象 Base base; //派生类自身属性和函数 int s_val = 10; void show()

xiaoxiaoguailou的博客 3027

数字IC后端项目典型问题之后端实战项目问题记录

数字IC后端培训教程之数字后端实战项目问题debug及解决方案记录

weixin_37584728的博客 1715

Windows下用Docker快速搭建SearXNG私有搜索引擎(附Dify集成配置)

本文详细介绍了在Windows环境下使用Docker快速搭建SearXNG私有搜索引擎的完整流程,包括环境准备、容器化部署、安全配置优化以及与Dify平台的深度集成方法。通过分步指导和实用配置示例,帮助开发者构建兼具隐私保护和AI增强能力的本地化搜索解决方案,特别适合需要定制化搜索服务的应用场景。

weixin_30300225的博客 336

初识C语言之函数封装篇——带你嗅探万花从中的清香(上)

函 数 概 述 构成C程序的基本单元是函数。函数中包含程序的可执行代码。 每个C程序的入口和出口都位于main函数之中。编写程序时,并不是将所有的内容都放在主函数main中。为了方便规划、组织、编写和调试,一般的做法是将一个程序划分成若干个程序模块,每一个程序模块都完成一部分功能。这样,不同的程序模块可以由不同的人来完成,从而可以提高软件开发的效率。 也就是说,主函数可以调用其他的函数,其他函数也可以相互调用。在main函数中调用其他的函数,这些函数执行完毕之后又返回到main函数中。通常把这些被调用

迷茫与徘徊只会让你陷入绝境,欢迎私信博主,带你开始提升变现价值! 4760

【Python搞定车载自动化测试】——Python实现车载以太网DoIP刷写(含Python源码)

随着智能电动汽车行业的发展,汽车=智能终端+四个轮子,而人工智能也发展越来越快,Python语言使用越来越广,本章节主要介绍如何使用Python语言基于Pytest自动化框架来实现DoIP诊断自动化测试。首先回顾一下DoIP诊断基础知识:DoIP(Diagnosis over Internet Protocol)是一种用于车辆诊断的网络通信协议。它基于现代互联网技术,允许通过以太网或IP网络进行车辆诊断和通信。

测试领域技术分享 3795

在C语言中实现封装、继承和多态

在C语言中,没有直接的支持封装、继承和多态等面向对象特性。C语言是结构化编程语言,通常通过函数和数据结构(结构体)来实现类似的功能。我们可以通过结构体、函数指针、和手动管理的对象生命周期来模拟C++中的面向对象的特性。

Hello__nibuhao的博客 1106

如何提高电路的抗干扰能力

本内容详细介绍了电源传导干扰处理,包括滤波、Feedthrough电容器、磁环、磁珠、屏蔽的使用与选型,EMC电磁兼容测试项目简介与要求,单片机与电源抗干扰处理等。

让你爱上电路设计 8598

电子设计(1)二极管防电源反接电路

二极管经常用来作电源防反接保护,所需器件少,电路简单。

记得诚 1万+

c语言的指针函数,函数指针,函数传参,封装函数,共用体,结构体指针

c语言的指针函数,函数指针,函数传参,封装函数,共用体,结构体指针

weixin_44110278的博客 149

2、欧洲期权的赫斯顿模型

本文详细介绍了赫斯顿随机波动率模型在欧洲期权定价中的应用。模型通过引入随机方差过程,克服了布莱克-斯科尔斯模型中波动率恒定的局限性,更贴近市场实际。文章阐述了模型的动态结构、风险中性转换、期权定价公式及其半封闭解的计算方法,并提供了基于VBA的数值实现方案。通过梯形法则与高斯积分等数值方法对比,分析了不同积分策略的精度与效率。同时验证了当波动率为零时,赫斯顿模型退化为布莱克-斯科尔斯模型的一致性。最后讨论了模型的优势、挑战及实际应用建议,强调了数值积分稳定性和参数估计的重要性。

tequila的博客 350

C语言实现(封装、继承和多态)

1. 封装 这个最简单了,C语言中虽然没有类,但有struct。这可是个好东西。我们可以在一个struct中存入数据和函数指针,以此来模拟类行为。 typedef struct _Parent { int a; int b; void (*print)(struct _Parent *This); }Parent; 封装性的意义在于,函数和数据是绑在一起的,数据和数...

小麦大大博客 1万+

攻克反光难题!YOLOv9工业缺陷检测实战:高反光件、微小划痕精准识别(附抗反光代码+产线数据)

文章摘要:本文针对不锈钢、铝合金等高反光工业件的缺陷检测难题,提出了一套“硬件抗反光+YOLOv9小目标增强”的解决方案。通过分析反光干扰(镜面/漫反射)和微小划痕(0.1mm级)两大核心问题,详细介绍了500万像素工业相机+偏振光源的硬件配置方案,以及基于偏振图像融合和超分辨率放大的预处理方法。最终实现误检率1.2%、微小划痕检出率99.3%的工业级检测效果,并提供了可落地的代码实现和车间实测数据。(148字)

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1041

交通网络数据集(24个)

这些网络数据主要由nodes,link,OD等信息构成,并组织成一系列文件。

C语言如何实现封装继承和多态

1. 封装 成员变量比较好说,关键是成员函数怎么办?C中的结构体如何放一个成员函数呢? 答:可以使用函数指针。 typedef struct Base { int a; void (*print)(struct Base* this); }Base; //模仿基类构造 Base* baseCtor(int a) { Base* this = (Base*)malloc(sizeof(Base...

princeteng's blogs 669

a_弹塑性UMAT_UMAT_塑性umat_elastoplastic_

用于abaqus中弹塑性本构关于UMAT 子程序的编写 已经经过验证 该程序正确合理

C语言也有封装、继承和多态

我就是擅长在面向过程的语言中用面向对象,在面向对象的语言中用面向过程。

阿星的博客 2940

Excel表格+Word文档各类各行业模板-产品生产量计算表.zip

Excel表格+Word文档各类各行业模板-产品生产量计算表.zip

Tencent-AILab-ChineseEmbedding.bin.all

Tencent_AILab_ChineseEmbedding.bin腾讯 200 维 800w 词向量全量 调用代码from gensim.models import KeyedVectors# 加载.bin文件bin_file_path = '/Volumes/Elements/Python 常用文件存放/常用大语言模型/腾讯词向量模型 800w-200 维全量/Tencent_AILab_ChineseEmbedding.bin.all/Tencent_AILab_ChineseEmbedding.bin'model = KeyedVectors.load(bin_file_path, mmap='r')# 定义词汇列表word_list = ['中国', '西方', '媒体', '关税', '制裁', '广告', '欧盟', '美国', '新加坡', '日本', '妥协', '反制措施', '全球化', '去全球化', '经济寒冬']word_list_dict = {}for item in word_list: try: similarity = model.similarity(item, '印度') word_list_dict[item] = similarity except KeyError: word_list_dict[item] = '词不在词汇表中'

用C语言实现c++的封装、继承、多态

c++的三大特性:封装、继承、多态 如何用C语言实现呢? 1、封装 在c++中,将数据与数据的操作封装在一起,也就是类 类只对外界开放接口,将接口的实现细节与类的一些属性,变量隐藏起来,达到数据的抽象性,隐藏性与封装性。 在C语言中,有一个类似于封装的类型——struct结构体(能够将多种数据类型封装在一起),那怎么实现将数据的操作一起封装起来呢? 我们想到了函数指针 //函数指

时光若止-Dale 2235

c语言封装原理,编译原理-c-c语言实现封装、继承和多态

2020-06-091、 概述C语言是一种面向过程的程序设计语言,而C++是在C语言基础上衍生来了的面向对象的语言,实际上,很多C++实现的底层是用C语言实现的,如在Visual C++中的Interface其实就是struct,查找Interface的定义,你可以发现有这样的宏定义:#ifndef Interface#define Interface struct#endifC++在语言级别上...

weixin_39720003的博客 517

用C语言来描述对象(类、属性、方法及封装、继承和多态的概念)

这里我们使用 C 语言来描述,并讲解类、属性、方法及封装、继承和多态的概念,代码可能会相对简单,因为 C 语言是一种面向过程的编程语言,没有直接支持类和对象的概念。在 C 语言中,没有直接的类、属性和方法的概念,但我们可以使用结构体和函数来模拟实现类似的概念。

qq_29041843的博客 1万+

面向对象编程与C语言:封装、继承和多态

面向对象编程(Object-Oriented Programming,简称OOP)是一种常用的编程范式,它以对象作为程序的基本单元,通过封装、继承和多态等机制来组织和管理代码。- 继承是指通过已有的类(称为父类或基类)来创建新的类(称为子类或派生类),子类可以继承并扩展父类的属性和方法。- 定义一个通用的函数接口,不同的对象可以使用不同的函数实现该接口,实现不同的行为。- 多态是指相同的操作可以作用于不同的对象,并根据对象的类型执行不同的行为。// 子类新增的属性。

m0_75198698的博客 545

C语言实现继承多态

使用虚函数实现:我们知道的是在C++中会维护一张虚函数表,根据赋值兼容规则,我们知道父类的指针或者引用是可以指向子类对象的。如果一个父类的指针或者引用调用父类的虚函数则该父类的指针会在自己的虚函数表中查找自己的函数地址,如果该父类对象的指针或者引用指向的是子类的对象,而且该子类已经重写了父类的虚函数,则该指针会调用子类的已经重写的虚函数。对于封装来说就是数据与具体操作实现的代码都放在某个对象的内部,使这些代码的具体细节不被外界发现,只留下一些接口供外部来使用,而不能一任何的形式来对象内部的实现。

Yisnow.的博客 736

C语言实现封装、继承、多态

C语言实现封装、继承、多态 文章目录C语言实现封装、继承、多态一. 封装二.继承三. 多态 一. 封装 C语言中虽然没有类,但有struct和指针。我们可以在一个struct中存入数据和函数指针,以此来模拟类行为。 typedef struct _Parent { int a; int b; void (*print)(struct _Parent *This); }Parent; 封装性的意义在于,函数和数据是绑在一起的,数据和数据是绑在一起的。这样,我们就可以通过简单的一

wolfGuiDao的博客 1863

C实现类封装、继承、多态

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34185320的博客 154

C语言实现封装、继承和多态

C语言实现封装、继承和多态 封装 C语言中虽然没有类,但有struct和指针。我们可以在一个struct中存入数据和函数指针,以此来模拟类行为。 typedef struct _Parent { int a; int b; void (*print)(struct _Parent *This); }Parent; 封装性的意义在于,函数和数据是绑在一起的,数据和数据是绑在一起的。这样,我们就可以通过简单的一个结构指针访问到所有的数据,遍历所有的函数。封装性,这是类拥有的属性

tupijiang的博客 335
上一篇: nginx 进程模型
下一篇: Linux 进程的管道通信
@@老胡
博客等级 码龄7年 291粉丝 184原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值