考虑这样的问题,有一台由多种功能板块组成的机器,并且这些板块是可以自由的插拔的,而且每种板块管理的参数也是不同的。我们用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语言的多态。