前言:

glib 和 gstreamer 体系依赖结构体来实现,其中涉及到虚函数,我们可以发现其中某些结构体成员的名字和其父结构体的成员是同名的,而这是允许的。

代码:

#include <stdio.h>

typedef void (*func1)(int);
typedef void (*func2)(char);

struct A{
        func1 pf;    //叫pf 的成员
};

struct B{
        struct A parent;
        func2 pf;    //同样有一个叫pf的成员,其实这里即便是同样的类型依旧没问题
        //func1 pf;  //不仅仅是同名称, 即便同类型同名称都可以
};


void func1Impl(int i){
        printf("func1Impl");
}
void func2Impl(char c){
        printf("func2Impl");
}

int main()
{
        struct B* pb = new B();
        pb->parent.pf = &func1Impl;
        pb->pf = &func2Impl;
        pb->pf(1);
        pb->parent.pf('c');
}