大胖的部落格

Just a note

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  112 随笔 :: 0 文章 :: 3 评论 :: 0 Trackbacks
如下代码用C模拟了C++中的多态,Base指针指向Derived对象,通过Base中的函数指针调用函数,实际上调用的是Derived的函数。

1、函数指针在两个结构体中的相对位置必须一致,这样,当通过Base指针来寻找函数指针时,才能在Derived中的相同位置找到函数指针。
2、因为要在函数中操作结构体成员变量,所以函数参数有结构体类型指针。
      调用时函数的参数传入的是Base指针,是为了和Base的函数指针指向的函数参数类型一致。当通过该指针找到实际函数时(Derived函数),该参数又被解释成为Derived指针(C语言弱类型?)。
3、如果两个结构体中函数指针的相对位置不一样,那么就会出错,可能将成员变量的值解释为函数地址,调用函数时出错。
4、如果Derived的函数还有第二个参数,此处也能调用成功,但第二个参数的值不确定(debug时为0,release时为Derived第一个成员变量的值)。

#include <iostream>

using namespace std;

//Base结构体
struct Base
{
    
int i;
    
int j;
    
int (*fun) (Base*);
}
;

//Base中函数指针所指函数
int fun_Base(Base* b)
{
    printf(
"fun_Base\n");
    
return b->+ b->j;
}


//Derived结构体
struct Derived
{
    
int i;
    
int j;
    
int (*fun) (Derived*);
    
int k;
}
;

//Derived中函数指针所指函数
int fun_Derived(Derived* d)
{
    printf(
"fun_Derived\n");
    
return d->+ d->+ d->k;
}



void main()
{
    
//初始化Derived结构体
    Derived d;
    d.i 
= 9;
    d.j 
= 2;
    d.k 
= 3;
    d.fun 
= fun_Derived;

    
//将Derived解释成为Base
    Base *pb = (Base*)&d;
    
int result = (pb->fun)(pb);        //按照Base的方式通过函数指针调用函数

    printf(
"%d\n", result);
}
posted on 2009-07-23 21:35 大胖 阅读(521) 评论(0)  编辑 收藏 引用 所属分类: Others

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理