void* C实现多态的载体

考虑这样的问题,有一台由多种功能板块组成的机器,并且这些板块是可以自由的插拔的,而且每种板块管理的参数也是不同的。我们用C++这类面向对象的语言可以很容易的实现这样的功能,因为面向对象的语言支持多态。于是有了这样的问题:

C语言如何实现多态?

面对上面的实际问题,C++是这样实现的:

class Board{
public:
	Board();
	virtual ~Board();
	virtual Board* getBoard() = 0;
	virtual void  setBoard(Board* board)=0;
private:
	int boardtype;
	Board* board;
}

class Board1 : public Board{
...
}
就是以这种虚函数的方式实现板卡的动态管理。

C语言本身无法实现虚函数这样的功能,但是我们还是想实现类似多态的功能怎么办?

空指针(void *)就是我们唯一可利用的工具,因为空指针可以指向任何数据类型也可以强制转化为任何类型,包括malloc这样的函数返回的也是空指针,所以利用空指针我们这样解决以上的实际问题:

struct Slot
{
	int boardtype;
	void  *board;
};

struct Board1
{
	int prarm1;
	.
	.
	.
	int prarmn;
}

struct Board2
{
	int prarm1;
	.
	.
	.
	int prarmn;
}
...

//卡槽插入板卡
struct Board2 *board = (struct Board2*)malloc(sizeof(struct Board2));
struct Slot slot;
slot.boardtype = 2;
slot.board = (void *)board;

反正这样就实现了一种C语言的多态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南波儿万

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值