C++中虚函数的实现背后
上一篇 /
下一篇 2012-09-07 13:22:41
/ 个人分类:C++
W4P&O%bm;_ i$s0 摘要:虚函数是很多编程语言中一个特性,比如c#,java,当然在c++语言中也有。这三种语言都是面向对象的语言。我们都知道面向对象语言有三个最基本的特征就是:继承,多态,封装。在c++语言中,这种多态的特征就是通过虚函 ...
S6f;Fe1L0%V4ZlcI
zLb
C'H0
虚函数是很多编程语言中一个特性,比如c#,java,当然在c++语言中也有。这三种语言都是面向对象的语言。我们都知道面向对象语言有三个最基本的
特征就是:继承,多态,封装。在c++语言中,这种多态的特征就是通过虚函数(virtual)来实现的。这种实现方法在其它语言中(比如c#)中也是如
此。51Testing软件测试网o/z2o}{-iJO`
51Testing软件测试网
Z]ce&k?
A 我要说的就是虚函数到底是怎么实现的。还是以例子来说明。我引用了上一篇随笔中的代码。
Z2N ~j:o8EL0Pu'de7v*R.o
h0class ClassA51Testing软件测试网*NUb
tH^ozz {51Testing软件测试网 m
VU _-h#f*[?]nj%s public: 3z+[ cd?9M?*FC0 void fun1();51Testing软件测试网nd-X*[*D;Y5~;y/C+MS void fun2(); ~(k EFxIX#u]0 virtual void fun3(); "Y:nE7c@bT*})x/K0};51Testing软件测试网dgOmX!o#c`o?c void ClassA::fun1() 1o)ZdG1Dr$l0{51Testing软件测试网B/b7Gn"}#f/M
l5j` cout << "ClassA.fun1"<<endl; LP5N$?+V#C
B0};51Testing软件测试网:U4w3H
a5q7LmB+\ void ClassA::fun2() 0R tGT` ?.[0{51Testing软件测试网f#H9U`:VsX"h,G cout << "ClassA.fun2"<<endl;51Testing软件测试网Z5^X%j(E+ac`4~7\ };51Testing软件测试网wL$vMv-[5j void ClassA::fun3()51Testing软件测试网tTZ!p$ax9L
y\~ {
v,?#wBd0 cout << "ClassA.fun3"<<endl;51Testing软件测试网!y6c
dAJbj+r;q }; +F'T3pBD-H*B-@5[0class ClassB : public ClassA51Testing软件测试网F;X5Wv
Y?1] {51Testing软件测试网XBR8bGix.G.e,I+L public:51Testing软件测试网n9iIcI`iQq/f void fun1();51Testing软件测试网^_"C;[$EZ void fun2(); 1So#O
qz{,Da0 virtual void fun3(); ~K!Nf7Z-J(w [0};51Testing软件测试网|:U1f
r Z2OW void ClassB::fun3() 6Rf;g(o~S[5zg0{ #q
YUO!B }0 cout << "ClassB.fun3"<<endl;51Testing软件测试网.ut_'A u6C }; 3C(\E0HerH8g0class ClassC : public ClassB ^MsAfS)s6D2FK0{ .lUI#kq
[^y7{)]0public:51Testing软件测试网0\-p7q2Tn void fun1();51Testing软件测试网*}'EN m[(T void fun2();51Testing软件测试网$EbC
?:J#L~
mK5D virtual void fun3();51Testing软件测试网fvd,MfD T }; 0_2zwRF
F'q)}0void ClassC::fun3()51Testing软件测试网Y"dh_^RV+X"? { ]V%F&\#RW6s){0 cout << "ClassC.fun3"<<endl; 4`gN~#Q$jO2C0}; Y:S'B
g:B([|g0void main() !c#o'sEKr H+b
?IL0{51Testing软件测试网H-c)Zk-G
]O,VO ClassA *a[3];51Testing软件测试网` v0I
},D t{E ClassA a1;51Testing软件测试网6~D&M6?D/YP ClassB b1; 1Z}
q#V4r\W0 ClassC c1;51Testing软件测试网h9U3p.@2ji q
rM 51Testing软件测试网T-c|Eg:l0OD a1.fun3(); %g{!F M5ZOqE0 b1.fun3();51Testing软件测试网1~;g]
f)AaX c1.fun3(); r,E9P;D
Cho051Testing软件测试网Bym,V,[BGl a[0] = &a1;51Testing软件测试网&G^1E p;a a[1] = &b1; 4X9z*@-mL#Q
Z#k"N0 a[2] = &c1;51Testing软件测试网+a+~Y/F~4f$q cout << "virtual function arraytest" <<endl;51Testing软件测试网{6WyY2?} for(int i=0;i<3;i++)51Testing软件测试网*e#sM^`,w { V.FNYZ[*m7K/B0 a[i]->fun3();
R8ll+d5A0p?!XvQ0 }51Testing软件测试网r9Cbq&?3] EUJ?l7Er'}|-w5o0 cout << "((ClassA)&b1).fun3():"; *mh;j ebWI,Z0 ((ClassA*)&b1)->fun3(); ;v#g,i
jmny?9]+r0 //object slicing HYR;a!B^'b6T h0 cout << "object slicing"<<endl;51Testing软件测试网t;L"Q/|H:TzQ cout <<"((ClassA)b1).fun3():";
|