C 语言实现多态和继承

C语言模拟实现C++继承和多态

提示:C 实现一个 struct A 和 stuct B 包含一个 int 成员 a 和 b,要求达到B 继承 A 的效果,也就是 B里面包含一个 A,并且能达到多态的效果,也就是一个 A* p 指向一个指向A 调的是 A 的函数,指向 B 调的是 B 的函数。


// 父类虚表
typedef struct vtblA
{
    void(*pfun1)();
}vtblA;

// 子类虚表
typedef struct vtblB
{
    vtblA vtbl;
    // 指向子类特有的成员函数
    void(*fun2_B)(int);
}vtblB;

// 父类虚函数
void fun1()
{
    printf("父类fun1\n");
}
// 子类重写父类虚函数fun1
void fun1_B()
{
    printf("子类重写fun1\n");
}

// 子类特有函数
void fun2_B(int)
{   
    printf("子类特有fun2\n");
}

// 父类
typedef struct A
{
    vtblA* pvtl;// 父类虚表指针
    int a;      // 父类数据成员
}A;

// 子类
typedef struct B
{
    A base_a; // 从父类继承而来的基类A
    int b;    // 子类数据成员
}B;

// 父类虚表结构
vtblA g_vtbl_A = {&fun1};
// 子类虚表结构
vtblB g_btbl_B = { {&fun1_B}, &fun2_B };

// 父类构造函数
void init_A(A* pa)
{
    pa->a = 10;
    pa->pvtl = &g_vtbl_A;
}
// 子类构造函数
void init_B(B* pb)
{
    init_A((A*)pb);
    pb->base_a.pvtl = (vtblA*)&g_btbl_B;
    pb->b = 20;
}
// 测试多态函数
void dosomething(A* p)
{
    // 如果p指向子类对象那么输出结果就是重写后的函数pfun1
    vtblA* pvtbl = (vtblA*)p->pvtl;
    (*pvtbl).pfun1();
}
int main()
{
    
    // 定义子类对象并构造
    B b;
    init_B(&b);
    // 调用父类自己的函数
    vtblB* pvtvl = (vtblB*)b.base_a.pvtl;
    (*pvtvl).fun2_B(5);
    // 定义父类指针
    A* pa = (A*)&b;
    // 测试多态
    dosomething(pa);
    return 0;
}



输出结果:

子类特有fun2
子类重写fun1




©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页