c语言面向对象:线程的派生类

这里将实现派生类的2个特性:
1 子类型可以转换为父类型。
2 子类型覆盖父类型的方法实现多态。

MyThread1Class.h
/****************************
* Black Spoor               *
****************************/
#ifndef _BLACKSPOOR_MYTHREAD1CLASS_H_
#define _BLACKSPOOR_MYTHREAD1CLASS_H_
#include "ZThreadClass.h"
typedef struct MyThread1Class
{
 ZThreadClass thread;
 ZThreadClass * threadptr;
 void(*Init)(struct MyThread1Class *);
 void(*Dispose)(struct MyThread1Class *);
}MyThread1Class;
extern MyThread1Class * MyThread1ClassCreate(void);
#endif

MyThread1Class.c
/****************************
* Black Spoor               *
****************************/

#include "MyThread1Class.h"
static void Init(struct MyThread1Class *);
static void Dispose(struct MyThread1Class *);
static void DoSomething(void *);
static void CreateResource(void *);
static void RemoveResource(void *);
static void Init(struct MyThread1Class * stu)
{
 ZThreadClass * th = &(stu->thread);
 ZThreadClassInit(th);
 th->Init(th);
 th->obj = stu; //这里的obj是MyThread1Class类型的,在ZThreadClass类方法(ZThread)里,obj将被转换为ZThreadClass类型。
 /*
 以下三条语句,给ZThreadClass的函数指针赋值,相当于覆盖了ZThreadClass类的方法。
 */
 th->VirtualDoSomething = DoSomething;
 th->VirtualCreateResource = CreateResource;
 th->VirtualRemoveResource = RemoveResource;
}
static void Dispose(struct MyThread1Class * stu)
{
 stu->thread.Dispose(&stu->thread);
 free(stu);
}
//线程执行的任务
static void DoSomething(void * obj)
{
 MyThread1Class * stu = (MyThread1Class *)obj;
 printf("线程 %s 正在运行 \n", stu->thread.threadName);
 stu->thread.ZSleep(300);
}
//创建资源
static void CreateResource(void * obj)
{
 MyThread1Class * stu = (MyThread1Class *)obj;
 printf("线程 %s 创建资源。 \n",stu->thread.threadName);
}
//删除资源
static void RemoveResource(void * obj)
{
 MyThread1Class * stu = (MyThread1Class *)obj;
 printf("线程 %s 删除资源。\n", stu->thread.threadName);
}
MyThread1Class * MyThread1ClassCreate(void)
{
 MyThread1Class * stu = (MyThread1Class *)malloc(sizeof(MyThread1Class));
 memset(stu, 0, sizeof(MyThread1Class));
 stu->Init = Init;
 stu->Dispose = Dispose;
 stu->threadptr = &stu->thread;
 return stu;
}


struct MyThread1Class结构体的第一个成员是ZThreadClass thread,这样定义结构体,可以使以下语句正常运行:
MyThread1Class * subClass = MyThread1ClassCreate();
ZThreadClass * parentClass = (ZThreadClass *) subClass;
这样就实现了子类型转换为父类型的效果。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值