用c语言实现面向对象的封装继承和多态

这篇博客通过C语言展示了如何实现面向对象编程的基本概念,包括封装、继承和多态。通过定义虚表(VTable)和宏定义,实现了基类Shape以及派生类Triangle和Circle。每个类都有相应的getName和draw方法,通过虚表调用这些方法实现了多态性。在main函数中,创建了Triangle和Circle对象,并使用统一的drawShape和getShapeName函数进行操作,体现了面向对象的特性。
摘要由CSDN通过智能技术生成
#include<string>
#include<iostream>
using namespace std;

struct Shape;
typedef const string& (*GetName)(Shape* shape);
typedef void (*Draw)(Shape* shape);

typedef struct VTable{//虚表的定义
	GetName getName;
	Draw draw;
}VTable;

const string& getNameTriangle(Shape* shape);
const string& getNameCircle(Shape* shape);
void drawTriangle(Shape* shape);
void drawCircle(Shape* shape);


static VTable vtableTriangle={getNameTriangle,drawTriangle};//初始化虚表
static VTable vtableCircle={getNameCircle,drawCircle};

typedef struct Shape{//定义基类形状
	string name;
	VTable* vptr;
}Shape;

//下面两个宏定义用来得到实际的指针
#define OFFSET(TYPE,MEMBER) ((unsigned int)&(((TYPE*)NULL)->MEMBER))
#define GET_CONTAINER_PTR(TYPE,MEMBER,MEMBERPTR) ((TYPE*)((unsigned int)MEMBERPTR-OFFSET(TYPE,MEMBER)))

typedef struct Triangle{//定义三角形,相当于从Shape public继承而来
	Shape base;
	int a,b,c;
}Triangle;

void initTriangle(Triangle* tr
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值