1 怎么用C语言实现多态-德赢Vwin官网 网
0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

怎么用C语言实现多态

程序喵大人 来源:程序喵大人 作者:程序喵大人 2022-10-12 09:12 次阅读

这里我想主要介绍下在C语言中是如何实现的面向对象。知道了C语言实现面向对象的方式,我们再联想下,C++中的class的运行原理是什么?

首先我们来写一段C++的class,拿一个Student类来举例子:

在头文件中,我定义一个Student类:

#pragma once
class Student {
public:
void SetNumber(int number);
void SetGrade(int grade);
void Print();
private:
int number;
int grade;
};

再在源文件中实现它:

#include "studentpp.h"
#include 
void Student::SetNumber(int number) { this->number = number; }
void Student::SetGrade(int grade) { this->grade = grade; }
void Student::Print() { printf("studentpp number : %d, grade : %d 
", this->number, this->grade);}

接下来是使用Student类:

#include 
#include "studentpp.h"
int main() {
Student *stu1 = new Student;
Student *stu2 = new Student;
stu1->SetNumber(11);
stu2->SetNumber(22);
stu1->SetGrade(111);
stu2->SetGrade(222);
stu1->Print();
stu2->Print();
delete stu1;
delete stu2;
}

我们再运行一下,运行结果不出所料。

那你有没有想过,它的底层是怎么实现的?为什么不同对象,设置了不同的number和grade,它的输出却不一样?

这个问题我们先放在这。等我用C语言实现一套这种方案后,估计你就明白了。

首先,在头文件中定义一个C语言的结构体Student:

#pragma once
typedef struct Student Student;
Student* CreateStudent();
void DestroyStudent(Student* student);
void SetNumber(Student* student, int number);
void SetGrade(Student* student, int grade);
void Print(Student* student);

注意在这里我使用了一个typedef,即Student = struct Student;

但是我却没有在头文件中定义它:

struct Student {
int number;
int grade;
};

我把它放在了源文件中,在源文件中定义它,再实现相关的方法。

#include "student.h"
#include 
#include 

struct Student {
int number;
int grade;
};

Student* CreateStudent() {
Student* self = (Student*)malloc(sizeof(Student));
return self;
}

void DestroyStudent(Student* student) {
if (!student) return;
free((void*)student);
}

void SetNumber(Student* student, int number) {
if (!student) return;
student->number = number;
}

void SetGrade(Student* student, int grade) {
if (!student) return;
student->grade = grade;
}

void Print(Student* student) {
if (!student) return;
printf("student number : %d, grade : %d 
", student->number, student->grade);
}

然后使用它:

#include "student.h"

int main() {
Student* stu1 = CreateStudent();
Student* stu2 = CreateStudent();
SetNumber(stu1, 11);
SetNumber(stu2, 22);
SetGrade(stu1, 111);
SetGrade(stu2, 222);
Print(stu1);
Print(stu2);
DestroyStudent(stu1);
DestroyStudent(stu2);
}

这是不是面向对象的原理?数据封装到了不同的指针下,不同的指针传到了相同的函数中,行为也会不同。

这时候我们再联想一下C++中的面向对象是不也是这个原理

平时我们使用的:

a->Print();

其实它的原理可能是这样的:

void Print(Student* this) {
this->number;
this->grade;
}

只不过编译器把默认的这个this参数隐藏在内部,我们看不见而已。其实每个成员函数默认都会有一个参数,就是对象的指针,也就是this指针。到这里你应该也就明白面向对象的原理了吧。

注意在这里我使用了一个typedef,即Student = struct Student;

但是我却没有在头文件中定义它。

这样可以更好的隐藏Student的实现,外面不知道Student究竟是什么东西,只有内部知道。在头文件中对外只暴露Student的指针,然后指针传到源文件中,再去解析它。

比如,我在其它地方想要得到Student的大小,编译器会报错,没法使用sizeof,因为它不知道Student,它只知道它是不完整的类型。而只能在源文件中使用sizeof。

这种设计是不是比C++的class更安全一些,确实安全,其实C++也可以这样实现,就是可以使用pImpl指针。

pimpl我暂时先不介绍,大家可以自己研究一下(其实历史文章中介绍过)。

大家可以思考下,怎么用C语言实现多态呢?

审核编辑:彭静
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7604

    浏览量

    136675
  • 编译器
    +关注

    关注

    1

    文章

    1623

    浏览量

    49107
  • 源文件
    +关注

    关注

    0

    文章

    30

    浏览量

    4586

原文标题:从C语言实现面向对象探究class的秘密

文章出处:【微信号:程序喵大人,微信公众号:程序喵大人】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    嵌入式C语言面向对象编程---多态

    前两篇文章主要讲述了 C 语言面向对象编程– 封装和继承。本篇文章继续来讨论一下,如何使用 C 语言实现面向对象编程的另一个重要特性:多态
    发表于 10-31 14:41 997次阅读

    C语言实现:见缝插针游戏!代码思路+源码分享

    见缝插圆我们昨天已经C语言实现了,今天将实现一个见缝插针的游戏。
    发表于 12-05 11:02 728次阅读

    如何用C语言实现OOP编程?

    老大看到OOP编程很好,就让我学,怎么C语言实现OOP编程的,请大侠指点
    发表于 10-30 03:45

    如何用C语言实现面向对象编程

    、组合、多态等面向对象的功能,但C语言有struct和函数指针。我们可以struct中的数据和函数指针,以此来模拟对象和类的行为。所以在正式开始设计模式前,先看看如何用
    发表于 07-12 07:24

    C语言实现DES算法

    C语言实现DES算法 本DES算法,使用了效率很高的C完成。目前,国内知名企业的POS终端中,单DES算法,均是采用这个函数完成。函数经本站验证过,可以
    发表于 01-16 10:09 3268次阅读

    C语言实现FFT算法

    C语言实现FFT算法 /*****************fft programe*********************/#include "typedef.h" #include "math.h" struct
    发表于 10-30 13:39 6341次阅读

    DSP算法的c语言实现

    DSP算法的c语言实现,又需要的朋友下来看看。
    发表于 05-09 10:59 0次下载

    C语言实现数字滤波

    C语言实现数字滤波 。对数值进行精度调整,下面给出几种常用的数字滤波方法的C语言函数,这些函数有一定的通用性,
    发表于 07-26 15:44 10次下载

    PID控制算法的C语言实现(完整版)

    PID控制算法的C语言实现一 PID算法原理
    发表于 11-05 15:45 0次下载

    C++语言实现火车排序功能

    C++语言实现火车排序功能
    发表于 01-05 11:27 2次下载

    4个重要算法C语言实现源代码

    4个重要算法C语言实现源代码
    发表于 06-10 08:00 12次下载

    EE-188:在ADSP-219x DSP上C语言实现中断驱动系统

    EE-188:在ADSP-219x DSP上C语言实现中断驱动系统
    发表于 04-17 14:59 0次下载
    EE-188:在ADSP-219x DSP上<b class='flag-5'>用</b><b class='flag-5'>C</b><b class='flag-5'>语言实现</b>中断驱动系统

    累加校验和C语言实现

    累加校验和C语言实现
    发表于 11-29 18:06 10次下载
    累加校验和<b class='flag-5'>C</b><b class='flag-5'>语言实现</b>

    C语言实现Web参数传递

    德赢Vwin官网 网站提供《C语言实现Web参数传递.docx》资料免费下载
    发表于 03-24 09:14 2次下载

    使用C语言实现的CRC计算单元的例子

    使用C语言实现的CRC计算单元的例子
    的头像 发表于 05-16 16:16 958次阅读