用C实现多态

本文介绍了一种利用C语言结构体实现可变参数传递的方法,并通过一个实例展示了如何在父类与子类间伪造运行时绑定,实现多态效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、重载

  1. struct mystru  
  2. {  
  3.     const char *name;  
  4.     double d;  
  5.     int number;  
  6. };  
  7.   
  8. void myfunc(struct mystru ms)  
  9. {  
  10.     printf("%s, %lf, %d\n", ms.name, ms.d, ms.number);  
  11. }  
  12. //使用
    1. #define func(...) myfunc((struct mystru) { __VA_ARGS__})  
    2. func("name",2.2);

1.用可变fun(...)传入可变形参。
2.将{__VA_ARGS__}强制类型转换为struct mystru__VA_ARGS__ 为可变参宏
3.调用myfunc

二、运行时绑定(一个简单的方法)
用父类解释子类申请的内存的时候,用相同的函数指针名字,访问同一片内存保存的指针的值,伪造出运行时绑定。

1.在子类和父类中分别定义相同名字的函数指针,就可以用父类访问到子类函数。


struct A{
    void (*foo)();
};
struct B{
    void (*foo)();
};
void A_foo()
{
    printf("this is A!\n");
}
void B_foo()
{
    printf("this is B!\n");
}
void A_construct(struct A *p)
{
    p->foo =A_foo;
}
void B_construct(struct B *p)
{
    p->foo = B_foo;
}
int main(void)
{
    printf("Hello World!\n");
    struct A *a = (struct A *)malloc(sizeof(struct A));
    struct B *b = (struct B *)malloc(sizeof(struct B));
    A_construct(a);
    B_construct(b);
    //a->foo();
    //b->foo();
    a =(struct A*) b;
    a->foo();
    return 0;
}

2.如果想访问成员变量还需要将this指针保存起来,
用父类对象访问子类的成员变量时,还需要将自身的指针传入当做参数,再访问成员变量。//没什么意义啊

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值