c语言 面向对象 pdf,面向对象的C语言

我建议不要使用预处理器(Ab)来尝试使C语法更像另一种更面向对象的语言。在最基本的级别上,您只需使用普通的结构作为对象,并通过指针传递它们:struct monkey{

float age;

bool is_male;

int happiness;};void monkey_dance(struct monkey *monkey){

/* do a little dance */}

要获得诸如继承和多态性之类的东西,您必须更加努力地工作。您可以通过让结构的第一个成员成为超类的实例来进行手动继承,然后可以自由地围绕指向基类和派生类的指针进行转换:struct base{

/* base class members */};struct derived{

struct base super;

/* derived class members */};struct derived d;struct base *base_ptr = (struct base *)&d;

// upcaststruct derived *derived_ptr = (struct derived *)base_ptr;  // downcast

要获得多态性(即虚拟函数),可以使用函数指针和可选的函数指针表,也称为虚拟表或vtable:struct base;struct base_vtable{

void (*dance)(struct base *);

void (*jump)(struct base *, int how_high);};struct base{

struct base_vtable *vtable;

/* base members */};void base_dance(struct base *b){

b->vtable->dance(b);}void base_jump(struct base *b, int how_high){

b->vtable->jump(b, how_high);}struct derived1{

struct base super;

/* derived1 members */};void derived1_dance(struct derived1 *d){

/* implementation of derived1's dance function */}void derived1_jump(struct derived1 *d, int how_high){

/* implementation of derived 1's jump function */}/* global vtable for derived1 */struct base_vtable derived1_vtable ={

&derived1_dance, /* you might get a warning here about incompatible pointer types */

&derived1_jump   /* you can ignore it, or perform a cast to get rid of it */};void derived1_init(struct derived1 *d){

d->super.vtable = &derived1_vtable;

/* init base members d->super.foo */

/* init derived1 members d->foo */}struct derived2{

struct base super;

/* derived2 members */};void derived2_dance(struct derived2 *d){

/* implementation of derived2's dance function */}void derived2_jump(struct derived2 *d, int how_high){

/* implementation of derived2's jump function */}struct base_vtable derived2_vtable ={

&derived2_dance,

&derived2_jump};void derived2_init(struct derived2 *d){

d->super.vtable = &derived2_vtable;

/* init base members d->super.foo */

/* init derived1 members d->foo */}int main(void){

/* OK!  We're done with our declarations, now we can finally do some

polymorphism in C */

struct derived1 d1;

derived1_init(&d1);

struct derived2 d2;

derived2_init(&d2);

struct base *b1_ptr = (struct base *)&d1;

struct base *b2_ptr = (struct base *)&d2;

base_dance(b1_ptr);  /* calls derived1_dance */

base_dance(b2_ptr);  /* calls derived2_dance */

base_jump(b1_ptr, 42);  /* calls derived1_jump */

base_jump(b2_ptr, 42);  /* calls derived2_jump */

return 0;}

这就是你在C中做多态的方法,它不是很漂亮,但它做的是工作。在基类和派生类之间存在一些涉及指针转换的棘手问题,只要基类是派生类的第一个成员,这些问题就是安全的。多重继承要困难得多-在这种情况下,为了在第一个基类之间进行大小写,您需要根据适当的偏移量手动调整指针,这是非常棘手和容易出错的。

您可以做的另一件(棘手的)事情是在运行时更改对象的动态类型!您只需重新分配一个新的vtable指针。您甚至可以在保留其他函数的同时选择性地更改一些虚拟函数,从而创建新的混合类型。只是要小心地创建一个新的vtable,而不是修改全局vtable,否则会意外地影响到给定类型的所有对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
学习C语言的好书. OOPC是指OOP(Object-Oriented Programming)与C语言的结合,它是一个面向对象C语言编程框架。它是一套C语言的宏,定义了OOP概念的关键字,借助于这一套宏,实现面向对象的特性,如类、对象、继承、接口、多态、消息等。   C++对于大型软件架构的良好可控性,和对以后程序员维护代码时良好的可读性;然而就目前来说,在嵌入式领域广泛的使用C++显然是不现实的事情。一般的嵌入式系统开发中只用到了其中的一小部分功能,而不需要全部的机制,比如多重继承、运算符重载等。因此,许多嵌入式系统的开发者就舍弃了C++的庞大身躯而回归到精简的C环境中。 一般情况下,一个更容易扩展、维护的软件通常采用的是OOP的思想,添加一个原本不存在的相对无关单独的个体,总比在一个已经存在的过程内硬塞进去一个对象要简单;而且面向过程更容易导致混乱的维护。然而舍弃C++的同时也舍弃了珍贵的OOP能力,实在太可惜了。 C语言良好的可移植性,对内存等良好的操作性以及执行之速度均是一般嵌入式产品的不二首选。我们要应此放弃C++吗?当然不,幸好已经有很多优秀的设计师为我们指明了C语言OOP化的道路。 虽然OOPC语法不如C++那么简洁,但是OOPC也有亮丽的特色,就是编译后的程序所占的内存空间比C++小的多,执行效率高,适用于Embedded System。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值