zhuxin
C++博客
首页
新随笔
联系
聚合
管理
随笔-0 评论-0 文章-24 trackbacks-0
深入理解虚函数
/*虚函数表*/
1
#include
<
iostream
>
2
using
namespace
std;
3
class
Base
4
{
5
private
:
6
virtual
void
f()
7
{
8
cout
<<
"
Base::f
"
<<
endl;
9
10
}
11
virtual
void
g()
12
{
13
cout
<<
"
Base::g
"
<<
endl;
14
}
15
virtual
void
h()
16
{
17
cout
<<
"
Base::h
"
<<
endl;
18
}
19
}
;
20
int
main(
void
)
21
{
22
typedef
void
(
*
Fun)(
void
);
23
Base b;
24
Fun pFun
=
NULL;
25
cout
<<
"
虚函数表地址:
"
<<
(
int
*
)(
&
b)
<<
endl;
26
cout
<<
"
虚函数表-第一个函数地址:
"
<<
(
int
*
)
*
(
int
*
)(
&
b)
<<
endl;
27
pFun
=
(Fun)
*
(((
int
*
)
*
(
int
*
)(
&
b))
+
0
);
28
pFun();
29
pFun
=
(Fun)
*
(((
int
*
)
*
(
int
*
)(
&
b))
+
1
);
30
pFun();
31
pFun
=
(Fun)
*
(((
int
*
)
*
(
int
*
)(
&
b))
+
2
);
32
pFun();
33
return
0
;
34
}
35
/*一般继承(无虚函数覆盖)*/
1
#include
<
iostream
>
2
using
namespace
std;
3
class
Base
4
{
5
private
:
6
virtual
void
f()
7
{
8
cout
<<
"
Base::f
"
<<
endl;
9
10
}
11
virtual
void
g()
12
{
13
cout
<<
"
Base::g
"
<<
endl;
14
}
15
virtual
void
h()
16
{
17
cout
<<
"
Base::h
"
<<
endl;
18
}
19
}
;
20
class
Derive:
public
Base
21
{
22
private
:
23
virtual
void
f1()
24
{
25
cout
<<
"
Derive::f1
"
<<
endl;
26
27
}
28
virtual
void
g1()
29
{
30
cout
<<
"
Derive::g1
"
<<
endl;
31
}
32
virtual
void
h1()
33
{
34
cout
<<
"
Derive::h1
"
<<
endl;
35
}
36
}
;
37
int
main(
void
)
38
{
39
typedef
void
(
*
Fun)(
void
);
40
Derive d;
41
Fun pFun
=
NULL;
42
cout
<<
"
虚函数表地址:
"
<<
(
int
*
)(
&
d)
<<
endl;
43
cout
<<
"
虚函数表-第一个函数地址:
"
<<
(
int
*
)
*
(
int
*
)(
&
d)
<<
endl;
44
pFun
=
(Fun)
*
(((
int
*
)
*
(
int
*
)(
&
d))
+
0
);
45
pFun();
46
pFun
=
(Fun)
*
(((
int
*
)
*
(
int
*
)(
&
d))
+
1
);
47
pFun();
48
pFun
=
(Fun)
*
(((
int
*
)
*
(
int
*
)(
&
d))
+
2
);
49
pFun();
50
pFun
=
(Fun)
*
(((
int
*
)
*
(
int
*
)(
&
d))
+
3
);
51
pFun();
52
pFun
=
(Fun)
*
(((
int
*
)
*
(
int
*
)(
&
d))
+
4
);
53
pFun();
54
pFun
=
(Fun)
*
(((
int
*
)
*
(
int
*
)(
&
d))
+
5
);
55
pFun();
56
return
0
;
57
}
/*一般继承(有虚函数覆盖)*/
1
#include
<
iostream
>
2
using
namespace
std;
3
class
Base
4
{
5
private
:
6
virtual
void
f()
7
{
8
cout
<<
"
Base::f
"
<<
endl;
9
10
}
11
virtual
void
g()
12
{
13
cout
<<
"
Base::g
"
<<
endl;
14
}
15
virtual
void
h()
16
{
17
cout
<<
"
Base::h
"
<<
endl;
18
}
19
}
;
20
class
Derive:
public
Base
21
{
22
private
:
23
virtual
void
f()
24
{
25
cout
<<
"
Derive::f
"
<<
endl;
26
27
}
28
virtual
void
g1()
29
{
30
cout
<<
"
Derive::g1
"
<<
endl;
31
}
32
virtual
void
h1()
33
{
34
cout
<<
"
Derive::h1
"
<<
endl;
35
}
36
}
;
37
int
main(
void
)
38
{
39
typedef
void
(
*
Fun)(
void
);
40
Base
*
b
=
new
Derive();
41
Fun pFun
=
NULL;
42
cout
<<
"
虚函数表地址:
"
<<
(
int
*
)(b)
<<
endl;
43
cout
<<
"
虚函数表-第一个函数地址:
"
<<
(
int
*
)
*
(
int
*
)(b)
<<
endl;
44
pFun
=
(Fun)
*
(((
int
*
)
*
(
int
*
)(b))
+
0
);
45
pFun();
46
pFun
=
(Fun)
*
(((
int
*
)
*
(
int
*
)(b))
+
1
);
47
pFun();
48
pFun
=
(Fun)
*
(((
int
*
)
*
(
int
*
)(b))
+
2
);
49
pFun();
50
pFun
=
(Fun)
*
(((
int
*
)
*
(
int
*
)(b))
+
3
);
51
pFun();
52
pFun
=
(Fun)
*
(((
int
*
)
*
(
int
*
)(b))
+
4
);
53
pFun();
54
return
0
;
55
}
56
/*多重继承(无虚函数覆盖)*/
1
#include
<
iostream
>
2
using
namespace
std;
3
class
Base1
4
{
5
private
:
6
virtual
void
f()
7
{
8
cout
<<
"
Base1::f
"
<<
endl;
9
}
10
virtual
void
g()
11
{
12
cout
<<
"
Base1::g
"
<<
endl;
13
}
14
virtual
void
h()
15
{
16
cout
<<
"
Base1::h
"
<<
endl;
17
}
18
}
;
19
class
Base2
20
{
21
private
:
22
virtual
void
f()
23
{
24
cout
<<
"
Base2::f
"
<<
endl;
25
}
26
virtual
void
g()
27
{
28
cout
<<
"
Base2::g
"
<<
endl;
29
}
30
virtual
void
h()
31
{
32
cout
<<
"
Base2::h
"
<<
endl;
33
}
34
}
;
35
class
Base3
36
{
37
private
:
38
virtual
void
f()
39
{
40
cout
<<
"
Base3::f
"
<<
endl;
41
}
42
virtual
void
g()
43
{
44
cout
<<
"
Base3::g
"
<<
endl;
45
}
46
virtual
void
h()
47
{
48
cout
<<
"
Base3::h
"
<<
endl;
49
}
50
}
;
51
class
Derive:
public
Base1,
public
Base2,
public
Base3
52
{
53
virtual
void
f1()
54
{
55
cout
<<
"
Derive::f1
"
<<
endl;
56
}
57
virtual
void
g1()
58
{
59
cout
<<
"
Derive::g1
"
<<
endl;
60
}
61
}
;
62
int
main(
void
)
63
{
64
typedef
void
(
*
Fun)(
void
);
65
Derive d;
66
Fun pFun
=
NULL;
67
cout
<<
"
虚函数表地址:
"
<<
(
int
*
)(
&
d)
<<
endl;
68
cout
<<
"
第一个虚函数表地址:
"
<<
(
int
*
)
*
((
int
*
)(
&
d)
+
0
)
<<
endl;
69
cout
<<
"
第二个虚函数表地址:
"
<<
(
int
*
)
*
((
int
*
)(
&
d)
+
1
)
<<
endl;
70
cout
<<
"
第三个虚函数表地址:
"
<<
(
int
*
)
*
((
int
*
)(
&
d)
+
2
)
<<
endl;
71
pFun
=
(Fun)
*
(((
int
*
)
*
((
int
*
)(
&
d)
+
0
))
+
0
);
72
pFun();
73
pFun
=
(Fun)
*
(((
int
*
)
*
((
int
*
)(
&
d)
+
0
))
+
1
);
74
pFun();
75
pFun
=
(Fun)
*
(((
int
*
)
*
((
int
*
)(
&
d)
+
0
))
+
2
);
76
pFun();
77
pFun
=
(Fun)
*
(((
int
*
)
*
((
int
*
)(
&
d)
+
0
))
+
3
);
78
pFun();
79
pFun
=
(Fun)
*
(((
int
*
)
*
((
int
*
)(
&
d)
+
0
))
+
4
);
80
pFun();
81
82
pFun
=
(Fun)
*
(((
int
*
)
*
((
int
*
)(
&
d)
+
1
))
+
0
);
83
pFun();
84
pFun
=
(Fun)
*
(((
int
*
)
*
((
int
*
)(
&
d)
+
1
))
+
1
);
85
pFun();
86
pFun
=
(Fun)
*
(((
int
*
)
*
((
int
*
)(
&
d)
+
1
))
+
2
);
87
pFun();
88
89
pFun
=
(Fun)
*
(((
int
*
)
*
((
int
*
)(
&
d)
+
2
))
+
0
);
90
pFun();
91
pFun
=
(Fun)
*
(((
int
*
)
*
((
int
*
)(
&
d)
+
2
))
+
1
);
92
pFun();
93
pFun
=
(Fun)
*
(((
int
*
)
*
((
int
*
)(
&
d)
+
2
))
+
2
);
94
pFun();
95
return
0
;
96
}
97
/*多重继承(有虚函数覆盖)*/
1
#include
<
iostream
>
2
using
namespace
std;
3
class
Base1
4
{
5
private
:
6
virtual
void
f()
7
{
8
cout
<<
"
Base1::f
"
<<
endl;
9
}
10
virtual
void
g()
11
{
12
cout
<<
"
Base1::g
"
<<
endl;
13
}
14
virtual
void
h()
15
{
16
cout
<<
"
Base1::h
"
<<
endl;
17
}
18
}
;
19
class
Base2
20
{
21
private
:
22
virtual
void
f()
23
{
24
cout
<<
"
Base2::f
"
<<
endl;
25
}
26
virtual
void
g()
27
{
28
cout
<<
"
Base2::g
"
<<
endl;
29
}
30
virtual
void
h()
31
{
32
cout
<<
"
Base2::h
"
<<
endl;
33
}
34
}
;
35
class
Base3
36
{
37
private
:
38
virtual
void
f()
39
{
40
cout
<<
"
Base3::f
"
<<
endl;
41
}
42
virtual
void
g()
43
{
44
cout
<<
"
Base3::g
"
<<
endl;
45
}
46
virtual
void
h()
47
{
48
cout
<<
"
Base3::h
"
<<
endl;
49
}
50
}
;
51
class
Derive:
public
Base1,
public
Base2,
public
Base3
52
{
53
virtual
void
f()
54
{
55
cout
<<
"
Derive::f
"
<<
endl;
56
}
57
virtual
void
g1()
58
{
59
cout
<<
"
Derive::g1
"
<<
endl;
60
}
61
}
;
62
int
main(
void
)
63
{
64
typedef
void
(
*
Fun)(
void
);
65
Derive d;
66
Fun pFun
=
NULL;
67
cout
<<
"
虚函数表地址:
"
<<
(
int
*
)(
&
d)
<<
endl;
68
cout
<<
"
第一个虚函数表地址:
"
<<
(
int
*
)
*
((
int
*
)(
&
d)
+
0
)
<<
endl;
69
cout
<<
"
第二个虚函数表地址:
"
<<
(
int
*
)
*
((
int
*
)(
&
d)
+
1
)
<<
endl;
70
cout
<<
"
第三个虚函数表地址:
"
<<
(
int
*
)
*
((
int
*
)(
&
d)
+
2
)
<<
endl;
71
pFun
=
(Fun)
*
(((
int
*
)
*
((
int
*
)(
&
d)
+
0
))
+
0
);
72
pFun();
73
pFun
=
(Fun)
*
(((
int
*
)
*
((
int
*
)(
&
d)
+
0
))
+
1
);
74
pFun();
75
pFun
=
(Fun)
*
(((
int
*
)
*
((
int
*
)(
&
d)
+
0
))
+
2
);
76
pFun();
77
pFun
=
(Fun)
*
(((
int
*
)
*
((
int
*
)(
&
d)
+
0
))
+
3
);
78
pFun();
79
80
pFun
=
(Fun)
*
(((
int
*
)
*
((
int
*
)(
&
d)
+
1
))
+
0
);
81
pFun();
82
pFun
=
(Fun)
*
(((
int
*
)
*
((
int
*
)(
&
d)
+
1
))
+
1
);
83
pFun();
84
pFun
=
(Fun)
*
(((
int
*
)
*
((
int
*
)(
&
d)
+
1
))
+
2
);
85
pFun();
86
87
pFun
=
(Fun)
*
(((
int
*
)
*
((
int
*
)(
&
d)
+
2
))
+
0
);
88
pFun();
89
pFun
=
(Fun)
*
(((
int
*
)
*
((
int
*
)(
&
d)
+
2
))
+
1
);
90
pFun();
91
pFun
=
(Fun)
*
(((
int
*
)
*
((
int
*
)(
&
d)
+
2
))
+
2
);
92
pFun();
93
return
0
;
94
}
95
posted on 2012-10-25 14:05
zhuxin
阅读(165)
评论(0)
编辑
收藏
引用
所属分类:
C/C++
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
malloc、calloc、realloc的区别
C++模板特化与偏特化
C语言运算符优先级
深入理解虚函数
C++对象内存分配
网站导航:
博客园
IT新闻
BlogJava
博问
Chat2DB
管理
<
2025年2月
>
日
一
二
三
四
五
六
26
27
28
29
30
31
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
1
2
3
4
5
6
7
8
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
给我留言
查看公开留言
查看私人留言
文章分类
C/C++(5)
Effective C++(1)
More Effective C++(1)
STL源码剖析(1)
操作系统
计算机网络
面试题(6)
排序算法(6)
设计模式
数据结构和算法(1)
数学(3)
网络编程
文章档案
2012年11月 (4)
2012年10月 (20)
搜索
最新评论