C语言的面向对象

本文回顾了C语言如何通过结构体和函数指针实现面向对象特性,尽管缺少继承,但通过其他方式模拟,如利用父类成员作为子类结构体变量。并通过一个动物类的例子展示了多态的实现。
摘要由CSDN通过智能技术生成

复习一下曾经的学习记录。讨论一下C语言如何面向对象,及和其它高级语言面向对象的区别。

众多高级语言都有OO的思想,属于OOP。

多年前大一上刚学习时,也不知道这些专业名词,什么是OO,什么是OOP。大一下学了C++,才了解面向对象,以为有class才是面向对象。后来的经过深入的学习才知道,C语言也可以做到面向对象,只不过没有那么完美罢了。

教材中称,C语言作为底层的面向过程的语言,不是面向对象的。实际上,内核源码中就有的思想,个人觉得就是可以把其作为对象使用,利用结构体和函数指针便能实现,不同于其它高级程序设计语言的OOP三大特性(继承、封装、多态),C语言实现的结构体作为对象来说,具有的是OOP中的两个特性(封装、多态),而不具备继承。

如果非要具有继承特性的话,可以考虑把父类成员作为子类结构体的一个变量(第一个变量,取决于编译器),毕竟C++就是这么干的。

一个简单的例子:
其中,定义了一个动物类。多态特性的简单实现可以利用结构体中的函数指针的再次赋值实现。

#include<stdio.h>

struct Animal{

	char name[128];
	int age;
	int sex;
	int dd;

	void (*peat)();
	void (*pbeat)();
};

// 3 eat
void dogEat(){
	printf("dog eat si\n");
}
void catEat(){
	printf("cat eat fish\n");
}
void personEat(){
	printf("person eat rice\n");
}

// 3 hit
void dogBeat(){
	printf("dog hit\n");
}
void catBeat(){
	printf("cat hit\n");
}
void personBeat(){
	printf("person hit\n");
}	


int main()
{
	//struct Animal dog;
	struct Animal cat;
	struct Animal person;

	struct Animal dog={"wang!",1,1,1,dogEat,dogBeat};

	// new method
	struct Animal dog2 = {
		.peat  = dogEat,
		.pbeat = dogBeat
	};


	dog.peat = dogEat;
	cat.peat = catEat;
	person.peat = personEat;

	dog.peat();
	dog2.peat();
	cat.peat();
	person.peat();

	//	printf("hello");
	return 0;
}

在这里插入图片描述

结构体变量整体赋值的两种方式:

struct Animal dog={"wang!",1,1,1,dogEat,dogBeat};

// 按需赋值,内核中的方法
struct Animal dog2 = {
	.peat  = dogEat,
	.pbeat = dogBeat
};
  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值