大胖的部落格
Just a note
C++博客
::
首页
::
新随笔
::
联系
::
聚合
::
管理
::
112 随笔 :: 0 文章 :: 3 评论 :: 0 Trackbacks
<
2009年7月
>
日
一
二
三
四
五
六
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
留言簿
给我留言
查看公开留言
查看私人留言
随笔分类
Algorithm(13)
(rss)
C#(13)
(rss)
C++(22)
(rss)
Design Pattern(23)
(rss)
Others(14)
(rss)
STL(9)
(rss)
Technical(2)
(rss)
UML(2)
(rss)
Win32(18)
(rss)
Reference
Windows XP command line
最新评论
1. re: 在TCL命令行中调用C函数
@Kenny
实在不好意思,时间太过久远,本人已好久没有接触TCL……
--大胖
2. re: 在TCL命令行中调用C函数
請問如何溝通array 變數
Q:1
tcl array in C
Q:2
C array in tcl
懇求指導
--Kenny
3. re: 在TCL命令行中调用C函数
谢谢!
--1232
用C实现多态
如下代码用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
->
i
+
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
->
i
+
d
->
j
+
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
大胖
阅读(522)
评论(0)
编辑
收藏
引用
所属分类:
Others
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
用C实现多态
printf
浮点数二进制表示
文件操作
字节对齐
函数调用方式
Big Endian & Little Endian 和位域
在TCL脚本中导入dll
在TCL命令行中调用C函数
Perl初学
网站导航:
博客园
IT新闻
BlogJava
博问
Chat2DB
管理
Powered by:
C++博客
Copyright © 大胖