如何使用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語言的面向對象功能;
來源:
https://www.cnblogs.com/linhaostudy/p/8448088.html
總結
以上是生活随笔為你收集整理的如何使用C语言的面向对象?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为公司做宣传的宣传文案30句
- 下一篇: 新赛季达摩出装及铭文(新赛季达摩出装及铭