嵌入式C语言自我修养学习:
“
在子类继承父类的过程中,一个接口可以有多种实现,在不同的子类中有不同的实现,我们通过基类指针去调用子类中的不同实现,就叫作多态。
我们也可以使用C语言来模拟多态:
如果我们把使用同一个结构体类型定义的不同结构体变量看成这个结构体类型的各个子类,那么在初始化各个结构体变量时,如果基类是抽象类,类成员中包含纯虚函数,则我们为函数指针成员赋予不同的具体函数,然后通过指针调用各个结构体变量的具体函数即可实现多态。
”
#include <stdio.h>
struct fs_operation {
void (*read)(void);
void (*write)(void);
};
struct file_system {
char fs_name[64];
struct fs_operation fops; //相当于C++中的纯虚函数,再定义的时候具体赋值,再通过指针调用,实现多态
};
void ext4_read(void)
{
printf("%s\n", __func__);
}
void ext4_write(void)
{
printf("%s\n", __func__);
}
void nfs_read(void)
{
printf("%s\n", __func__);
}
void nfs_write(void)
{
printf("%s\n", __func__);
}
int main()
{
struct file_system ext4 = { //子类ext4
.fs_name = "ext4",
.fops.read = ext4_read,
.fops.write = ext4_write,
};
struct file_system nfs = { //子类nfs
.fs_name = "nfs",
.fops.read = nfs_read,
.fops.write = nfs_write,
};
struct file_system* pfs; //定义一个指向基类的指针
pfs = &ext4; //基类指针指向子类 ext4
pfs->fops.read(); //和下面一起实现了多态
pfs = &nfs;
pfs->fops.read();
return 0;
}
输出:
$ gcc poly.c -o poly && ./poly.exe
ext4_read
nfs_read