用C语言实现面向对象编程
作者:网络转载 发布时间:[ 2013/7/11 10:37:14 ] 推荐标签:
三、多态的实现:多态,简而言之即一个接口,多种实现。也是用相同的抽象类的代码实现不同 的功能。在 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<stdio.h>
#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);
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11