多态是面向对象编程中的一个概念,表示一个对象,比如一个接口,在不同的情况下,有不同的表现形式。比如,对于人这个对象,其都会有吃饭,这个接口。但是对于不同的”人,其吃饭所用的工具可能不尽相同,比如,中国人通常用筷子吃,外国人通常用的是刀叉,当然,对于中国小孩,也可能用的是勺子,😃 。
C语言中基本数据类型,含义十分的明确,32bit系统来说,char就是一个字节,short就是两个字节,int和long也有类似的定义。那么,如何用C语言实现,同一个数据类型表达多个含义呢?我们其实可以使用union来实现,一定程度上的数据类型多态。
废话不多说,上代码:
typedef union vals{
char c;
short s;
int i;
float f;
long v;
}vals_t;
vals_t是一个union,他有多大呢?64bit系统下,8个字节,即,union中最大的数据类型的大小,这里是float。
那它怎么实现了多态性呢?我们修改一下代码:
//gcc 7.4.0
#include <stdio.h>
typedef union vals{
char c;
short s;
int i;
float f;
long v;
}vals_t;
typedef struct {
vals_t vt;
}mul_type_t;
int main(void)
{
mul_type_t mt;
/*char*/
mt.vt.v = 'N';
printf("mt.vt.c = %c\n", mt.vt.c);
/*short*/
mt.vt.v= 0x1234;
printf("mt.vt.s = 0x%x\n", mt.vt.s);
/*int*/
mt.vt.v = 0x12345678;
printf("mt.vt.i = 0x%x\n", mt.vt.i);
/*float*/
mt.vt.v = 0x414570A3;
printf("mt.vt.f = %.3f\n", mt.vt.f);
return 0;
}
输出:
mt.vt.c = N
mt.vt.s = 0x1234
mt.vt.i = 0x12345678
mt.vt.f = 12.340
mul_type_t是一个复合数据类型,我们分别对其赋值为char(‘N’)、short(0x1234)、int(0x12345678)、float(0x414570A3),然后,我们分别以对应的数据类型进行了打印,可以看到,对于同一个数据类型,mt,在不同的打印情况下,其表达了不同的数据类型,这就是C语言数据类型的多态。