日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言中如何使用面向对象编程,如何使用C语言的面向对象

發布時間:2023/12/4 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言中如何使用面向对象编程,如何使用C语言的面向对象 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我們都知道,C++才是面向對象的語言,但是C語言是否能使用面向對象的功能?

(1)繼承性

typedef struct _parent

{

int data_parent;

}Parent;

typedef struct _Child

{

struct _parent parent;

int data_child;

}Child;

在設計C語言繼承性的時候,我們需要做的就是把基礎數據放在繼承的結構的首位置即可。這樣,不管是數據的訪問、數據的強轉、數據的訪問都不會有什么問題。

(2)封裝性

class的類成員默認情況下都是private,而struct的成員都是public(不能改變),所以如何讓C語言實現封裝的功能呢?答案就是函數指針;這在內核中得到了廣泛的應用;

struct _Data;

typedef? void (*process)(struct _Data* pData);

typedef struct _Data

{

int value;

process pProcess;

}Data;

封裝性的意義在于,函數和數據是綁在一起的,數據和數據是綁在一起的。這樣,我們就可以通過簡單的一個結構指針訪問到所有的數據,遍歷所有的函數。封裝性,這是類擁有的屬性,當然也是數據結構體擁有的屬性。

(3)多態性

在C++中,多態通常都是使用虛函數來實現的,但是C語言中并沒有虛函數,如何實現重載呢?

答案也顯而易見,也是函數指針的擴展,以下面例子為例:

#include

#include

//虛函數表結構

struct base_vtbl

{

void(*dance)(void *);

void(*jump)(void *);

};

//基類

struct base

{

/*virtual table*/

struct base_vtbl *vptr;

};

void base_dance(void *this)

{

printf("base dance\n");

}

void base_jump(void *this)

{

printf("base jump\n");

}

/* global vtable for base */

struct base_vtbl base_table =

{

base_dance,

base_jump

};

//基類的構造函數

struct base * new_base()

{

struct base *temp = (struct base *)malloc(sizeof(struct base));

temp->vptr = &base_table;

return temp;

}

//派生類

struct derived1

{

struct base super;

/*derived members */

int high;

};

void derived1_dance(void * this)

{

/*implementation of derived1's dance function */

printf("derived1 dance\n");

}

void derived1_jump(void * this)

{

/*implementation of derived1's jump function */

struct derived1* temp = (struct derived1 *)this;

printf("derived1 jump:%d\n", temp->high);

}

/*global vtable for derived1 */

struct base_vtbl derived1_table =

{

(void(*)(void *))&derived1_dance,

(void(*)(void *))&derived1_jump

};

//派生類的構造函數

struct derived1 * new_derived1(int h)

{

struct derived1 * temp= (struct derived1 *)malloc(sizeof(struct derived1));

temp->super.vptr = &derived1_table;

temp->high = h;

return temp;

}

int main(void)

{

struct base * bas = new_base();

//這里調用的是基類的成員函數

bas->vptr->dance((void *)bas);

bas->vptr->jump((void *)bas);

struct derived1 * child = new_derived1(100);

//基類指針指向派生類

bas? = (struct base *)child;

//這里調用的其實是派生類的成員函數

bas->vptr->dance((void *)bas);

bas->vptr->jump((void *)bas);

return 0;

}

綜上所述,可以實現C語言的面向對象功能;

總結

以上是生活随笔為你收集整理的c语言中如何使用面向对象编程,如何使用C语言的面向对象的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。