综述
多态性是面向对象程序设计的一个重要特征。
在C++语言中,多态指的是:具有不同功能的函数可以用同一个函数名,可以用一个函数名调用不同内容的函数。
C++的多态分为两种:
1. 静态多态性(编译时多态):在程序编译时系统就能决定调用的是哪个函数,因此称为编译时多态性
2. 动态多态性:在程序运行过程中才动态确定操作指针指向的对象,又被称为运行时多态
C++实现多态可以用虚函数,抽象类,覆盖以及模板实现
C语言是面向过程的语言,但同样可以实现多态性,可以通过宏实现编译时多态,用函数指针实现动态多态
C语言用宏实现编译时多态
例如以下例子是用宏实现双向链表的一部分
#include <stdio.h>
#include <stdlib.h>
#define INIT_LIST_TYPE(type) \
typedef struct list_element_##type { \
struct list_element_##type* next, *pre; \
void* val; \
} list_element_##type; \
typedef struct list_head_##type { \
list_element_##type* elem, *last; \
int length; \
} list_head_##type;
#define list_element(type) \
list_element_##type
#define list_head(type) \
list_head_##type
#define LIST_FUNC_DECLARE(type) \
list_head_##type* init_list_##type();
#define LIST_FUNC_INIT(type) \
_init_list(type)
#define init_list(type) init_list_##type()
#define _init_list(type) \
list_head_##type* init_list_##type() \
{ \
list_head_##type* h = (list_head_##type*)calloc(1, sizeof(list_head_##type)); \
h->last = h->elem = NULL; \
h->length = 0; \
return h; \
}
#endif
调用
INIT_LIST_TYPE(int);
LIST_FUNC_INIT(int);
INIT_LIST_TYPE(float);
LIST_FUNC_INIT(float);
#define context_bam_elem list_element(int)
#define list_head_t list_head(int)
#define list_element_f_t list_element(float)
#define list_head_f_t list_head(float)
int main()
{
list_head_t* h = init_list(int);
list_head_f_t* h1 = init_list(float);
return 0;
}