c 语言中类的实现方法,用 C 语言实现面向对象编程

三、多态的实现:多态,简而言之即一个接口,多种实现。也就是用相同的抽象类的代码实现不同 的功能。在 C 中多态的实现是通过接口来实现的。借用 lw_oopc.h 宏文件,设计一个计算的多态例子如下:

1、接口的定义:本例是实现加法、减法运算。加和减都是调用类的同一个成员函数,却分别实现 了加、减的功能。本例的接口表示获得计算结果,但不知道采样什么样的计算方法。

/*    operater.h   */

#ifndef OPER_H

#define OPER_H INTERFACE(IOPERATOR)

{

double (*GetResult)(double,double);

};

#endif

/*-------------end of operater.h ------------------*/

2、 在加法类 Add 中实现接口 IOPERATOR

/*****   Add.C ***/

#include "lw_oopc_kc.h"

#include"operater.h"      // 头文件顺序很重要,lw_oopc_kc.h 在前,原因很简单不解释

#include "classes.h"

/************************** 类 Add 定义在 classes.h 中

CLASS(Add)

{

IMPLEMENTS(IOPERATOR);

};************/

static double GetResult(double a,double b)

{

return (a+b);

}

CTOR(Add)

FUNCTION_SETTING(IOPERATOR.GetResult,GetResult); END_CTOR

/***----- END OF ADD.C-----****/

3、 在减法类 Sub 中实现接口 IOPERATOR

/***--- Sub.c ---******/

#include "lw_oopc_kc.h"

#include"operater.h"

#include "classes.h"

/***********类 Sub 定义在 classes.h 中

CLASS(Sub)

{

IMPLEMENTS(IOPERATOR);

};*/

static double GetResult(double a,double b)

{

return (a-b);

}

CTOR(Sub) FUNCTION_SETTING(IOPERATOR.GetResult,GetResult);

END_CTOR

/***----- END OF Sub.C-----****/

4、 组合,把 operater.h、Add.C、Sub.C 和 main.C 组成一个工程,main.c 文件如下:

/***--- main.c ---******/

#include

#include "lw_oopc_kc.h"

#include"operater.h"      // 头文件顺序很讲究,lw_oopc_kc.h 必须在前面

#include "classes.h" int  main()

{

int a = 10, b=5;

int c1,c2;

IOPERATOR *poper;               //--定义接口指针,用指针实现多态

Add A;                          //---对象 A 成员函数实现加法

Sub S;                          //---对象 B 成员函数实现减法

CLASS_CTOR(Add, A); CLASS_CTOR(Sub, S);

//---静态内存处理方法

poper = &A;        //也可以动态内存方法:oper = New(Add); 记得 free()

c1 = (poper->GetResult(a,b));      // c1 的结果 = 15 ( a+b)

poper = &S;

c2 = poper->GetResult(a,b);      // c2 结果= 5 (a-b)

return 0;

}

/***----- END OF main.C-----****/

总结:

1、在 lw_oopc_kc.h 的基础上,为了增加可理解性,不改变原作含义为前提下,增加了以下宏

#define CLASS_CTOR(Class,obj)       Class##Setting(&obj)        //--对象的构造宏

#define INHERIT(BASE)     IMPLEMENTS(BASE)                        //---类继承宏

#ifndef LW_OOPC_PURE_STATIC

#ifndef LW_OOPC_STATIC

#define New(Class)     Class##New()                  //--对象动态构造宏

#endif

#endif

2、类的实例化必须有 3 步:定义、构造、初始化。尤其初始化时候通常是通过指针的应用来实现对类内部成员的访问。

3、继承实现方法:用父类名在子类中定义一个对象作为子类的一个成员变量,通过拥有该对象实 现子类对父类功能的拥有,即继承。

注意:子类成员中用父类定义的对象,其构造函数要放在子类的初始化函数里(本人的解决方 法),因为子类的构造函数通过宏实现,不能直接调用父类的构造函数(如果您有更好办法,请和给大家分享)。

5、 函数和函数指针的写法:将函数名变为指针,函数参数只要参数说明。

e.g.        double GetResult(double a,double b) 转为函数指针为:

double (* GetResult)(double, double);

32/3<123>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值