C++的虚函数是多态的基础, 关于它的常见规则,已经网上已经有很多文章描述过了。我在这里仅仅是写下几行代码,来展现各种情况,相信你大概能在这里找到你所困惑的情况。如果想系统的了解,到网络上寻找别人总结性的文章。
在linux下可以执行以下命令编译执行代码
g++ -g -o main main.cpp && ./main
demo源码:
1 #include <iostream>
2 using namespace std;
3
4 class base {
5 public:
6 virtual void virtualfun(){
7 cout << "base::this is base virtual_fun " << endl;
8 }
9
10 void commonfun(){
11 cout << "base::this is base common fun " << endl;
12 }
13 };
14
15 class level1 : public base {
16 public:
17 void commonfun();
18 virtual void virtualfun();
19 };
20
21 void
22 level1::virtualfun(){
23 cout << " level1::this is level1 virtual_fun " << endl;
24 }
25
26 void
27 level1::commonfun(){
28 cout << " level1::this is level1 common_fun " << endl;
29 }
30
31
32 int
33 main(int argc, char* argv[])
34 {
35 level1 level1_1;
36 base base_1;
37
38 cout << endl;
39 cout << "### level1_1 ###" << endl;
40 level1_1.virtualfun();
41 level1_1.commonfun();
42
43 cout << endl;
44 cout << "### base_1 ###" << endl;
45 base_1.virtualfun();
46 base_1.commonfun();
47
48 base& ref_base_base = base_1;
49 base& ref_base_level1 = level1_1;
50 level1& ref_level1 = level1_1;
51
52 base* p_base = &base_1;
53 level1* p_level1 = &level1_1;
54
55 cout << endl;
56 cout << "### ref_base_base ### " << endl;
57 ref_base_base.virtualfun();
58 ref_base_base.commonfun();
59
60 cout << endl;
61 cout << "### ref_base_level1 ### notice this!!!" << endl;
62 ref_base_level1.virtualfun();
63 ref_base_level1.commonfun();
64
65 cout << endl;
66 cout << "### ref_level1 ### " << endl;
67 ref_level1.virtualfun();
68 ref_level1.commonfun();
69
70 cout << endl;
71 cout << "### p_level1 = &level1_1 ### " << endl;
72 p_level1->virtualfun();
73 p_level1->commonfun();
74
75 cout << endl;
76 cout << "### p_base = &base_1###" << endl;
77 p_base->virtualfun();
78 p_base->commonfun();
79
80 cout << endl;
81 cout << "### p_base = &level1_1 ### notice this!!" << endl;
82 p_base = &level1_1;
83 p_base->virtualfun();
84 p_base->commonfun();
85
86 cout << endl;
87 cout << "### (*p_base).virtualfun() && (*pbase).commonfun() ### " << endl;
88
89 (*p_base).virtualfun();
90 (*p_base).commonfun();
91
92 cout << endl;
93 cout << "### base_2 = (*p_base) ###" << endl;
94 base base_2 = (*p_base);
95 base_2.virtualfun();
96 base_2.commonfun();
97
98 }
执行结果如下
xiaol-luo@CentOS:~/link/net_codes/c++/virtual$ g++ -g -o main main.cpp && ./main
### level1_1 ###
level1::this is level1 virtual_fun
level1::this is level1 common_fun
### base_1 ###
base::this is base virtual_fun
base::this is base common fun
### ref_base_base ###
base::this is base virtual_fun
base::this is base common fun
### ref_base_level1 ### notice this!!!
level1::this is level1 virtual_fun
base::this is base common fun
### ref_level1 ###
level1::this is level1 virtual_fun
level1::this is level1 common_fun
### p_level1 = &level1_1 ###
level1::this is level1 virtual_fun
level1::this is level1 common_fun
### p_base = &base_1###
base::this is base virtual_fun
base::this is base common fun
### p_base = &level1_1 ### notice this!!
level1::this is level1 virtual_fun
base::this is base common fun
### (*p_base).virtualfun() && (*pbase).commonfun() ###
level1::this is level1 virtual_fun
base::this is base common fun
### base_2 = (*p_base) ###
base::this is base virtual_fun
base::this is base common fun
View Code
原文链接: https://www.cnblogs.com/xiaol-luo/archive/2013/05/15/3079618.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/88564
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!