如何使用C语言的面向对象
时间:2022-05-03
本文章向大家介绍如何使用C语言的面向对象,主要内容包括(1)继承性、(2)封装性、(3)多态性、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
我们都知道,C++才是面向对象的语言,但是C语言是否能使用面向对象的功能?
(1)继承性
1 typedef struct _parent
2 {
3 int data_parent;
4 }Parent;
5 typedef struct _Child
6 {
7 struct _parent parent;
8 int data_child;
9 }Child;
在设计C语言继承性的时候,我们需要做的就是把基础数据放在继承的结构的首位置即可。这样,不管是数据的访问、数据的强转、数据的访问都不会有什么问题。
(2)封装性
class的类成员默认情况下都是private,而struct的成员都是public(不能改变),所以如何让C语言实现封装的功能呢?答案就是函数指针;这在内核中得到了广泛的应用;
1 struct _Data;
2 typedef void (*process)(struct _Data* pData);
3 typedef struct _Data
4 {
5 int value;
6 process pProcess;
7 }Data;
封装性的意义在于,函数和数据是绑在一起的,数据和数据是绑在一起的。这样,我们就可以通过简单的一个结构指针访问到所有的数据,遍历所有的函数。封装性,这是类拥有的属性,当然也是数据结构体拥有的属性。
(3)多态性
在C++中,多态通常都是使用虚函数来实现的,但是C语言中并没有虚函数,如何实现重载呢?
答案也显而易见,也是函数指针的扩展,以下面例子为例:
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 //虚函数表结构
5 struct base_vtbl
6 {
7 void(*dance)(void *);
8 void(*jump)(void *);
9 };
10
11 //基类
12 struct base
13 {
14 /*virtual table*/
15 struct base_vtbl *vptr;
16 };
17
18 void base_dance(void *this)
19 {
20 printf("base dancen");
21 }
22
23 void base_jump(void *this)
24 {
25 printf("base jumpn");
26 }
27
28 /* global vtable for base */
29 struct base_vtbl base_table =
30 {
31 base_dance,
32 base_jump
33 };
34
35 //基类的构造函数
36 struct base * new_base()
37 {
38 struct base *temp = (struct base *)malloc(sizeof(struct base));
39 temp->vptr = &base_table;
40 return temp;
41 }
42
43
44 //派生类
45 struct derived1
46 {
47 struct base super;
48 /*derived members */
49 int high;
50 };
51
52 void derived1_dance(void * this)
53 {
54 /*implementation of derived1's dance function */
55 printf("derived1 dancen");
56 }
57
58 void derived1_jump(void * this)
59 {
60 /*implementation of derived1's jump function */
61 struct derived1* temp = (struct derived1 *)this;
62 printf("derived1 jump:%dn", temp->high);
63 }
64
65 /*global vtable for derived1 */
66 struct base_vtbl derived1_table =
67 {
68 (void(*)(void *))&derived1_dance,
69 (void(*)(void *))&derived1_jump
70 };
71
72 //派生类的构造函数
73 struct derived1 * new_derived1(int h)
74 {
75 struct derived1 * temp= (struct derived1 *)malloc(sizeof(struct derived1));
76 temp->super.vptr = &derived1_table;
77 temp->high = h;
78 return temp;
79 }
80
81
82
83 int main(void)
84 {
85
86 struct base * bas = new_base();
87 //这里调用的是基类的成员函数
88 bas->vptr->dance((void *)bas);
89 bas->vptr->jump((void *)bas);
90
91
92 struct derived1 * child = new_derived1(100);
93 //基类指针指向派生类
94 bas = (struct base *)child;
95
96 //这里调用的其实是派生类的成员函数
97 bas->vptr->dance((void *)bas);
98 bas->vptr->jump((void *)bas);
99 return 0;
100 }
综上所述,可以实现C语言的面向对象功能;
- 【Go 语言社区】奇妙的go语言(网页下载)-转
- 【Go 语言社区】golang的bufio用于内容解析
- [Go语言]从Docker源码学习Go——指针和Structs - lemon_bar
- Git 项目推荐 | Go 语言读写 INI 文件工具包
- 初识Python (r10笔记第52天)
- 挑战数据结构与算法面试题——统计上排数在下排出现的次数
- Go语言的 10 个实用技术--转
- MySQL反连接的优化总结(r10笔记第51天)
- python基础知识——内置数据结构(列表)
- 【Go 语言社区】Go语言Slice去重
- 【Go 语言社区】Golang 语言再谈接口
- 【Go 语言社区】Golang 语言再谈常量
- 【Go 语言社区】HTML5 Canvas+JS控制电脑或手机上的摄像头实例
- MySQL Profile在5.7的简单测试(r10笔记第50天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- linux操作系统df、du命令
- Python数据分析之基础篇(三)
- Python数据分析之matplotlib(基础篇)
- Python数据分析之matplotlib(提高篇)
- Python数据分析之matplotlib(应用篇)
- Intel OpenCL 之 Pipeline(一):基本概念
- Intel OpenCL 之 Pipeline(二)For循环的执行机制
- Intel OpenCL 之 Pipeline(三)不能pipeline的可能情况
- Intel OpenCL 之 Pipeline(四):Pipeline不理想的几种情况
- Python数据分析之NumPy(基础篇)
- Python数据分析之NumPy(运算篇)
- Python数据分析之NumPy(高级篇)
- Python数据分析之Pandas(数据结构)
- Python数据分析之Pandas(数据操作)
- Python数据分析之Seaborn(样式风格)