衡阳派盒市场营销有限公司

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語言實現多態呢?

審核編輯:彭靜
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C語言
    +關注

    關注

    180

    文章

    7614

    瀏覽量

    137698
  • 編譯器
    +關注

    關注

    1

    文章

    1642

    瀏覽量

    49283
  • 源文件
    +關注

    關注

    0

    文章

    30

    瀏覽量

    4612

原文標題:從C語言實現面向對象探究class的秘密

文章出處:【微信號:程序喵大人,微信公眾號:程序喵大人】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    嵌入式C語言面向對象編程---多態

    前兩篇文章主要講述了 C 語言面向對象編程– 封裝和繼承。本篇文章繼續來討論一下,如何使用 C 語言實現面向對象編程的另一個重要特性:多態
    發表于 10-31 14:41 ?1053次閱讀

    C語言實現:見縫插針游戲!代碼思路+源碼分享

    見縫插圓我們昨天已經C語言實現了,今天將實現一個見縫插針的游戲。
    發表于 12-05 11:02 ?788次閱讀

    如何用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 ?3277次閱讀

    C語言實現FFT算法

    C語言實現FFT算法 /*****************fft programe*********************/#include "typedef.h" #include "math.h" struct
    發表于 10-30 13:39 ?6358次閱讀

    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參數傳遞

    電子發燒友網站提供《C語言實現Web參數傳遞.docx》資料免費下載
    發表于 03-24 09:14 ?2次下載

    使用C語言實現的CRC計算單元的例子

    使用C語言實現的CRC計算單元的例子
    的頭像 發表于 05-16 16:16 ?1072次閱讀
    网络百家乐官网游赌博| 大发888的任务怎么做| 百家乐赢钱皇冠网| 发中发百家乐的玩法技巧和规则| 永利高百家乐现金网| 郑州太阳城宾馆| 大发888娱乐游戏技巧| 曼哈顿百家乐的玩法技巧和规则| 澳门赌百家乐的玩法技巧和规则| 基础百家乐博牌| 上市百家乐评论| 百家乐群号| 百家乐的各种打法| 威尼斯人娱乐城地图| 永利高平台| 晓游棋牌官方下载| 88娱乐城网址| 潞西市| 百家乐官网真人荷官| 台州市| 百家乐官网视频双扣| 百家乐官网两边| 金百家乐官网的玩法技巧和规则| 娱乐城新用户送彩金| 瑞安市| 百家乐官网博乐36bol在线| 淘宝博百家乐官网的玩法技巧和规则| 百家乐官网园蒙| 百家乐怎么才赢| 百家乐AG| 威尼斯人娱乐网注册送38元彩金| 稳赢至尊| 博彩百家乐官网心得| 娱乐百家乐官网的玩法技巧和规则| 24山安葬择日| 至尊百家乐娱乐平台| 大发888真钱游戏下载官网| 博e百娱乐城注册| 如何看百家乐官网的路纸| 百家乐官网开闲的几率多大| 百家乐赌博娱乐城|