• 多态的C语言实现版本


      1 #ifndef _51_2_H                                                             
      2 #define _51_2_H
      3 typedef void Demo;
      4 typedef void Derived;
      5 Demo* Demo_create(int i,int j);
      6 int Demo_geti(Demo*pthis);
      7 int Demo_getj(Demo*pthis);
      8 int Demo_add(Demo*pthis,int value);
      9 void Demo_free(Demo*pthis);
     10 
     11 Derived*Derived_create(int i,int j,int k);
     12 int Derived_getk(Derived*pthis);
     13 int Derived_add(Derived*pthis,int value);
     14 #endif
      1 #include<stdio.h>                                                           
      2 #include"51-2.h"
      3 #include<malloc.h>
      4 //定义父子类的虚函数
      5 static int Demo_virtual_add(Demo*pthis,int value);
      6 static int Derived_virtual_add(Derived*pthis,int value);
      7 //2。确定虚函数表的类型,虚函数表的结构体,用来创建虚函数表,存储虚函数地址
      8 //目的是为了实现add函数的多态
      9 struct vtbl{
     10     int(*padd)(Derived*,int);//3。函数指针的定义
     11 };
     12 struct classdemo{
     13     struct vtbl* vptr;//1。定义虚函数表指针,指针的类型
     14     int mi;
     15     int mj;
     16 };
     17 static struct vtbl g_Demo_vtbl = {
     18     Demo_virtual_add
     19 };//4。全局虚函数表变量,static关键字将该变量隐藏在此文件中,外部不能访问
     20 static struct vtbl g_Derived_vtbl = {
     21     Derived_virtual_add
     22 };
     23 struct classderived{
     24     struct classdemo d;
     25     int mk;                                                                 
     26 };
     27 Demo* Demo_create(int i,int j){
     28     struct classdemo* ret = (struct classdemo*)malloc(sizeof(struct classdem    o));//分配空间
     29     if(ret != NULL){
     30         ret->vptr = &g_Demo_vtbl;//5。将虚函数表和具体对象关联起来
     31         ret->mi = i;
     32         ret->mj = j;
     33     }
     34     return ret;
     35 }
     36 int Demo_geti(Demo*pthis){//具体实现函数  强制类型转换
     37     struct classdemo* obj = (struct classdemo*)pthis;
     38     return obj->mi;
     39 }
     40 int Demo_getj(Demo*pthis){
     41     struct classdemo* obj = (struct classdemo*)pthis;
     42     return obj->mj;
     43 }
     44 //6。分析、实现具体的虚函数
     45 static int Demo_virtual_add(Demo*pthis,int value){                          
     46     struct classdemo* obj = (struct classdemo*)pthis;
     47     return obj->vptr->padd(pthis,value);
     48 }
     49 int Demo_add(Demo*pthis,int value){
     50     struct classdemo* obj = (struct classdemo*)pthis;
     51     return obj->mi + obj->mj + value;
     52 }
     53 void Demo_free(Demo*pthis){
     54     free(pthis);
     55 }
     56 Derived*Derived_create(int i,int j,int k){
     57     struct classderived* ret = (struct classderived*)malloc(sizeof(struct cl    assderived));
     58     if(ret != NULL){
     59         ret->d.vptr = &g_Derived_vtbl;//关联到子类的虚函数表上去
     60         ret->d.mi = i;
     61         ret->d.mj = j;
     60         ret->d.mi = i;
     61         ret->d.mj = j;
     62         ret->mk = k;
     63     }
     64     return ret;
     65 }
     66 int derived_getk(Derived* pthis){                                           
     67     struct classderived* obj = (struct classderived*)pthis;
     68     return obj->mk;
     69 }
     70 static int Derived_virtual_add(Derived*pthis,int value){
     71     struct classderived* obj = (struct classderived*)pthis;
     72     return obj->mk + value;
     73 }
     74 int Derived_add(Derived*pthis,int value){
     75     struct classderived* obj = (struct classderived*)pthis;
     76     return obj->d.vptr-> padd(pthis,value);
     77 }
      1 #include<stdio.h>                                                           
      2 #include"51-2.h"
      3 void run(Demo*p,int v){
      4     int r = Demo_add(p,v);
      5     printf("r=%d
    ",r);
      6 }
      7 int main(){
      8     Demo* pb = Demo_create(1,2);
      9     Demo* pd = Derived_create(1,22,333);
     10 
     11     printf("Demo_add(3)=%d
    ",Demo_add(pb,3));
     12     printf("Derived_add(3)=%d
    ",Derived_add(pd,3));
     13 
     14     run(pb,3);
     15     run(pd,3);
     16     Demo_free(pb);
     17     Demo_free(pd);
     18     return 0;
     19 }
  • 相关阅读:
    整理SVN代码-->正式环境的代码
    业务(1)
    在一个项目中跨领域调用接口的的实现
    一个java文件编译之后会产生多个class文件
    shutil模块
    shevle模块
    confiparser模块
    sys模块
    subprocess模块
    【ADO.NET】3、从TXT中导入数据到数据库
  • 原文地址:https://www.cnblogs.com/DXGG-Bond/p/11967897.html
Copyright © 2020-2023  润新知