st struct Base * const * cp = self;
assert(self && *cp && (*cp)->draw);
(*cp)->draw(self);
}
/**
* 基类Base的内部头文件Base.r,对外隐藏
*/
#ifndef BASE_R
#define BASE_R
#include
struct Base {
size_t size;
void * (*constructor)(void * self, va_list * app); //构造函数
void * (*destroy)(void * self); //析构函数
void (*draw)(const void * self);//作图函数
};
#endif
/**
* Point的头文件Point.h(对外提供接口)
*/
#ifndef POINT_H
#define POINT_H
extern const void * Point; /* new(Point, x, y); */
void move(void * point, int dx, int dy);
struct Point {
const void * base; //继承Base类,基类指针,放在第一个位置,const是防止修改
int x, y; //坐标
};
#define point_x(p)(((const struct Point *)(p)) -> x)
#define point_y(p)(((const struct Point *)(p)) -> y)
#endif
//Point的源文件Point.c
#include
#include Point.h
#include cnew.h
#include Base.h
/**********Point类自己的构造函数***********/
static void * Point_New(void * _self, va_list * app) {
struct Point * self = _self;
self->x = va_arg(*app, int);
self->y = va_arg(*app, int);
printf(Point_New self = %p , self);
return self;
}
/**********Point类自己的析构函数***********/
static void* Point_Delete(void * _self) {
printf(call Point_Delete self =%p , _self);
printf(@@@@@@@@@@@@@@@@@@@@@@@@@@@@ );
return NULL;
}
/**********Point类自己的绘图函数***********/
static void Point_Draw(const void * _self) {
const struct Point * self = _self;
printf(Point_Draw at %d,%d , self->x, self->y);
}
void move(void * _self, int dx, int dy) {
struct Point * self = _self;
printf(call move self =%p , _self);
self->x += dx;
self->y += dy;
}
static const struct Base _Point = { sizeof(struct Point), Point_New, Point_Delete, Point_Draw };
const void * Point = &_Point;
/**
* Circle的头文件Circle.h(对外提供接口)
*/
#ifndef CIRCLE_H
#define CIRCLE_H
#include Point.h
extern const void * Circle; /* new(Circle, x, y, rad) */
struct Circle {
const struct Point pbase; //继承Point类,需放在第一位
int radius;
int (*area)(void *self);// 面积,扩展方法
};
#define circle_area(p) (((const struct Circle *)(p)) -> area(p))
#endif
/**
* Circle的源文件Circle.c
*/
#include
#include Circle.h
#include cnew.h
#include Base.h
/**********Circle类自己的扩展函数***********/
static int Circle_Area(void * _self) {
const struct Circle * self = _self;
printf(call Circle_Area self =%p , _self);
return self->radius * self->radius;
}
/**********Circle类自己的构造函数***********/
static void * Circle_New(void * _self, va_list * app) {
struct Circle * self = ((const struct Base *) Point)->constructor(_self, app);
self->radius = va_arg(*app, int);
self->area = Circle_Area;
printf(call Circle_New self =%p , _self);
return self;
}
/**********Circle类自己的构造函数***********/
static void* Circle_Delete(void * _self) {
printf(call Circle_Delete self =%p , _self);
printf(@@@@@@@@@@@@@@@@@@@@@@@@@@@@ );
return NULL;
}
/**********Circle类自己的绘图函数***********/
static void Circle_Draw(const void * _self) {
const struct Circle * self = _self;
int x = point_x(self);
int y = point_y(self);
printf(Circle_Draw at %d,%d rad %d , x, y, self->radius);
}
static const struct Base _Circle = { sizeof(struct Circle), Circle_New, Circle_Delete, Circle_Draw };
const void * Circle = &_Circle;
/**
* 测试函数
*/
#include Circle.h
#include cnew.h
int oo_main(int argc, char ** argv) {
void * p;
int i;
for (i = 0; i < 2; i++) {
if (i == 0) {
p = cnew(Circle, 1, 2, 3);
circle_area(p);
} else {
p = cnew(Point, 1, 2);
}
draw(p);
move( |