首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

请教,怎么用标准C怎么实现多态

2013-10-23 
请问,如何用标准C如何实现多态?如题,最好有相关的说明,多谢!c++的特点就是 多态 派生 继承这些!c语言实现

请问,如何用标准C如何实现多态?
如题,最好有相关的说明,多谢!

c++的特点就是 多态 派生 继承这些!

c语言实现不的!都不能重载的!
[解决办法]
参考我的系列博文http://blog.csdn.net/turingo/article/details/8516327。

引用:
如题,最好有相关的说明,多谢!

[解决办法]
代码生成参考:
//codegen.c
// 输入一组字符串,比如
// aa ss ddd dd 33 dd
// 然后自动生成一个函数 int A(const char*);
// 实现A("aa")返回0  A("ss")返回1 依次类推
#include <stdio.h>
int main(int argc,char **argv) {
    int i;
    if (argc<2) {
        printf("%s p1 [p2 ...] [>result.c]\nGenerate code int A(const char *a); 0==A("p1") 1==A("p2") ...",argv[0]);
        return 1;
    }
    //printf("#include <string.h>\n");
    printf("int A(const char *a) {\n");
    for (i=0;i<argc-1;i++) {
        printf("    if (0==strcmp(a,"%s")) return %d;\n",argv[i+1],i);
    }
    printf("    return -1;\n");
    printf("}\n");
    return 0;
}
//C:\test\Debug>codegen.exe
//codegen.exe p1 [p2 ...] [>result.c]
//Generate code int A(const char *a); 0==A("p1") 1==A("p2") ...
//C:\test\Debug>codegen.exe aa ss ddd dd 33 dd
//int A(const char *a) {
//    if (0==strcmp(a,"aa")) return 0;
//    if (0==strcmp(a,"ss")) return 1;
//    if (0==strcmp(a,"ddd")) return 2;
//    if (0==strcmp(a,"dd")) return 3;
//    if (0==strcmp(a,"33")) return 4;
//    if (0==strcmp(a,"dd")) return 5;
//    return -1;
//}
//
//c:\test\Debug>codegen.exe aa ss ddd dd 33 dd >result.c
//
//c:\test\Debug>type result.c
//int A(const char *a) {
//    if (0==strcmp(a,"aa")) return 0;
//    if (0==strcmp(a,"ss")) return 1;
//    if (0==strcmp(a,"ddd")) return 2;
//    if (0==strcmp(a,"dd")) return 3;
//    if (0==strcmp(a,"33")) return 4;
//    if (0==strcmp(a,"dd")) return 5;
//    return -1;
//}
//

[解决办法]
最简单的办法就是用function pointer模拟


struct naiveSimulatation
{
  typedef void (*Foo)(int);
  typedef void (*Foo2)(float, float);

  Foo foo;
  Foo2 foo2;
  //......
};

void print_int(int value)
{
    //std::cout<<value<<std::endl;
    printf("%d\n", value);
}

void print_float(float a, float b)
{
    //std::cout<<a<<", "<<b<<std::endl;
    printf("%f, %f\n", a, b);
}

int main()
{
    naiveSimulatation sss;
    sss.foo = print_int;
    sss.foo2 = print_float;
    sss.foo(444);

    return 0;
}


切记此多态的使用上不但麻烦,而且效率低
这方法,你如果宣告naiveSimulatation sss[10], 
那么那些function pointer就会产生10份
能用c++还是别靠这别扭的方法模拟了

encapsulation?
在.c档中declare和implement你的函数即可,前面要加上static
这方法的问题是每个struct在.c档里头的"data member"都是一样的
如果你需要让每个不同的struct有自己的"data member"
最简单的方法就是放弃encapsulation

c就是因为太low level,表达能力有严重的极限,软件发展史上才会出现c++
low level != high performance,openCV2用c++重新设计的api已经证明了这一点
[解决办法]
1)用一个结构或者表-- 数组--持有函数指针
2)数据结构的前面数据都相同,并且第一个数据表示数据的长度。
比如 struct dataheader{
    int size;
    int x,y;
}

struct ADataImpl{
   dataheader head;
   int z,w;   
};

struct Adata{
      union{
      dataheader head;


      AdtatImpl a;      
      }; 
};

void func(struct dataheader *head);
void func_AData(struct dataheader *head);

struct dataheader *head=malloc (sizeof(AData));
typedef void (*Func_Calc)(struct dataheader *head);

Func_Calc f[10];
void InstallFunc(struct dataheader *head,Func_Calc &f)
{
  if(head->size ==sizeof(dataheader))
      f = func;
  else f = func_AData; 
}
int main()
{
   struct dataheader d;
   struct Adata a ;
   
   struct dataheader *p[10]={&d,&a};
   for(i=0;i<2;i++)
      InstallFunc(p+i,f+i);
   for(i=0;i<2;i++)
         f[i](p+i);    
return 0;
}
大概类似种种方法,具体看下驱动程序的开发方式,和 libtiff源码
这些都是C实现,类似C++多态的方式 。

热点排行