RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

怎么用C語(yǔ)言實(shí)現(xiàn)多態(tài)

程序喵大人 ? 來(lái)源:程序喵大人 ? 作者:程序喵大人 ? 2022-10-12 09:12 ? 次閱讀

這里我想主要介紹下在C語(yǔ)言中是如何實(shí)現(xiàn)的面向?qū)ο?。知道了C語(yǔ)言實(shí)現(xiàn)面向?qū)ο蟮姆绞?,我們?cè)俾?lián)想下,C++中的class的運(yùn)行原理是什么?

首先我們來(lái)寫(xiě)一段C++的class,拿一個(gè)Student類(lèi)來(lái)舉例子:

在頭文件中,我定義一個(gè)Student類(lèi):

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

再在源文件中實(shí)現(xiàn)它:

#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);}

接下來(lái)是使用Student類(lèi):

#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;
}

我們?cè)龠\(yùn)行一下,運(yùn)行結(jié)果不出所料。

那你有沒(méi)有想過(guò),它的底層是怎么實(shí)現(xiàn)的?為什么不同對(duì)象,設(shè)置了不同的number和grade,它的輸出卻不一樣?

這個(gè)問(wèn)題我們先放在這。等我用C語(yǔ)言實(shí)現(xiàn)一套這種方案后,估計(jì)你就明白了。

首先,在頭文件中定義一個(gè)C語(yǔ)言的結(jié)構(gòu)體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);

注意在這里我使用了一個(gè)typedef,即Student = struct Student;

但是我卻沒(méi)有在頭文件中定義它:

struct Student {
int number;
int grade;
};

我把它放在了源文件中,在源文件中定義它,再實(shí)現(xiàn)相關(guān)的方法。

#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);
}

這是不是面向?qū)ο蟮脑???shù)據(jù)封裝到了不同的指針下,不同的指針傳到了相同的函數(shù)中,行為也會(huì)不同。

這時(shí)候我們?cè)俾?lián)想一下C++中的面向?qū)ο笫遣灰彩沁@個(gè)原理

平時(shí)我們使用的:

a->Print();

其實(shí)它的原理可能是這樣的:

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

只不過(guò)編譯器把默認(rèn)的這個(gè)this參數(shù)隱藏在內(nèi)部,我們看不見(jiàn)而已。其實(shí)每個(gè)成員函數(shù)默認(rèn)都會(huì)有一個(gè)參數(shù),就是對(duì)象的指針,也就是this指針。到這里你應(yīng)該也就明白面向?qū)ο蟮脑砹税伞?/p>

注意在這里我使用了一個(gè)typedef,即Student = struct Student;

但是我卻沒(méi)有在頭文件中定義它。

這樣可以更好的隱藏Student的實(shí)現(xiàn),外面不知道Student究竟是什么東西,只有內(nèi)部知道。在頭文件中對(duì)外只暴露Student的指針,然后指針傳到源文件中,再去解析它。

比如,我在其它地方想要得到Student的大小,編譯器會(huì)報(bào)錯(cuò),沒(méi)法使用sizeof,因?yàn)樗恢繱tudent,它只知道它是不完整的類(lèi)型。而只能在源文件中使用sizeof。

這種設(shè)計(jì)是不是比C++的class更安全一些,確實(shí)安全,其實(shí)C++也可以這樣實(shí)現(xiàn),就是可以使用pImpl指針。

pimpl我暫時(shí)先不介紹,大家可以自己研究一下(其實(shí)歷史文章中介紹過(guò))。

大家可以思考下,怎么用C語(yǔ)言實(shí)現(xiàn)多態(tài)呢?

審核編輯:彭靜
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7604

    瀏覽量

    136683
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1623

    瀏覽量

    49108
  • 源文件
    +關(guān)注

    關(guān)注

    0

    文章

    30

    瀏覽量

    4586

原文標(biāo)題:從C語(yǔ)言實(shí)現(xiàn)面向?qū)ο筇骄縞lass的秘密

文章出處:【微信號(hào):程序喵大人,微信公眾號(hào):程序喵大人】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    嵌入式C語(yǔ)言面向?qū)ο缶幊?--多態(tài)

    前兩篇文章主要講述了 C 語(yǔ)言面向?qū)ο缶幊台C 封裝和繼承。本篇文章繼續(xù)來(lái)討論一下,如何使用 C 語(yǔ)言實(shí)現(xiàn)面向?qū)ο缶幊痰牧硪粋€(gè)重要特性:多態(tài)。
    發(fā)表于 10-31 14:41 ?997次閱讀

    C語(yǔ)言實(shí)現(xiàn):見(jiàn)縫插針游戲!代碼思路+源碼分享

    見(jiàn)縫插圓我們昨天已經(jīng)C語(yǔ)言實(shí)現(xiàn)了,今天將實(shí)現(xiàn)一個(gè)見(jiàn)縫插針的游戲。
    發(fā)表于 12-05 11:02 ?728次閱讀

    如何用C語(yǔ)言實(shí)現(xiàn)OOP編程?

    老大看到OOP編程很好,就讓我學(xué),怎么C語(yǔ)言實(shí)現(xiàn)OOP編程的,請(qǐng)大俠指點(diǎn)
    發(fā)表于 10-30 03:45

    如何用C語(yǔ)言實(shí)現(xiàn)面向?qū)ο缶幊?/a>

    、組合、多態(tài)等面向?qū)ο蟮墓δ?,?b class='flag-5'>C語(yǔ)言有struct和函數(shù)指針。我們可以struct中的數(shù)據(jù)和函數(shù)指針,以此來(lái)模擬對(duì)象和類(lèi)的行為。所以在正式開(kāi)始設(shè)計(jì)模式前,先看看如何用
    發(fā)表于 07-12 07:24

    C語(yǔ)言實(shí)現(xiàn)DES算法

    C語(yǔ)言實(shí)現(xiàn)DES算法 本DES算法,使用了效率很高的C完成。目前,國(guó)內(nèi)知名企業(yè)的POS終端中,單DES算法,均是采用這個(gè)函數(shù)完成。函數(shù)經(jīng)本站驗(yàn)證過(guò),可以
    發(fā)表于 01-16 10:09 ?3269次閱讀

    C語(yǔ)言實(shí)現(xiàn)FFT算法

    C語(yǔ)言實(shí)現(xiàn)FFT算法 /*****************fft programe*********************/#include "typedef.h" #include "math.h" struct
    發(fā)表于 10-30 13:39 ?6341次閱讀

    DSP算法的c語(yǔ)言實(shí)現(xiàn)

    DSP算法的c語(yǔ)言實(shí)現(xiàn),又需要的朋友下來(lái)看看。
    發(fā)表于 05-09 10:59 ?0次下載

    C語(yǔ)言實(shí)現(xiàn)數(shù)字濾波

    C語(yǔ)言實(shí)現(xiàn)數(shù)字濾波 。對(duì)數(shù)值進(jìn)行精度調(diào)整,下面給出幾種常用的數(shù)字濾波方法的C語(yǔ)言函數(shù),這些函數(shù)有一定的通用性,
    發(fā)表于 07-26 15:44 ?10次下載

    PID控制算法的C語(yǔ)言實(shí)現(xiàn)(完整版)

    PID控制算法的C語(yǔ)言實(shí)現(xiàn)一 PID算法原理
    發(fā)表于 11-05 15:45 ?0次下載

    C++語(yǔ)言實(shí)現(xiàn)火車(chē)排序功能

    C++語(yǔ)言實(shí)現(xiàn)火車(chē)排序功能
    發(fā)表于 01-05 11:27 ?2次下載

    4個(gè)重要算法C語(yǔ)言實(shí)現(xiàn)源代碼

    4個(gè)重要算法C語(yǔ)言實(shí)現(xiàn)源代碼
    發(fā)表于 06-10 08:00 ?12次下載

    EE-188:在ADSP-219x DSP上C語(yǔ)言實(shí)現(xiàn)中斷驅(qū)動(dòng)系統(tǒng)

    EE-188:在ADSP-219x DSP上C語(yǔ)言實(shí)現(xiàn)中斷驅(qū)動(dòng)系統(tǒng)
    發(fā)表于 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'>語(yǔ)言實(shí)現(xiàn)</b>中斷驅(qū)動(dòng)系統(tǒng)

    累加校驗(yàn)和C語(yǔ)言實(shí)現(xiàn)

    累加校驗(yàn)和C語(yǔ)言實(shí)現(xiàn)
    發(fā)表于 11-29 18:06 ?10次下載
    累加校驗(yàn)和<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言實(shí)現(xiàn)</b>

    C語(yǔ)言實(shí)現(xiàn)Web參數(shù)傳遞

    電子發(fā)燒友網(wǎng)站提供《C語(yǔ)言實(shí)現(xiàn)Web參數(shù)傳遞.docx》資料免費(fèi)下載
    發(fā)表于 03-24 09:14 ?2次下載

    使用C語(yǔ)言實(shí)現(xiàn)的CRC計(jì)算單元的例子

    使用C語(yǔ)言實(shí)現(xiàn)的CRC計(jì)算單元的例子
    的頭像 發(fā)表于 05-16 16:16 ?959次閱讀
    RM新时代网站-首页