【C++ Primer】类的多态
上一篇 / 下一篇 2012-07-12 13:17:34 / 个人分类:C++
Dv1j1p9vkV S*Z}%U"Er0 一、概述51Testing软件测试网T-w[+Ls+?
51Testing软件测试网*VE d!\w1)接口的多种不同的实现方式即为多态。
&O)wE.\]9m D0E y(Vu!O;Z}#nCr0f0 2)多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式 运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。多态性在C++中都是通过虚函数(Virtual Function) 实现的。51Testing软件测试网sJ0C%Nb3eLz }&F
51Testing软件测试网)?H g6r'a-GV3)关键点:多态还有个关键之处就是一切用指向基类的指针或引用来操作对象51Testing软件测试网wJ,tA8YL|
51Testing软件测试网LUFhbIf j7d6D二、示例
N&_t$lIe#A051Testing软件测试网 X%T Q-w0tmT/y9D1)普通的对象操作方式51Testing软件测试网-L3l e)e6?|5k7w$W
"M4P6N'on cu0
`j'VAQuO(by:I0#include <iostream> o,_De%p*c0using namespace std; 0GnAS ZYr1Q-d0class A{ hq4L[2r?a3[^0public: J M+x%V2qqZQ.Oo0 void print() k1}6Y b$\Baa2Sj:F0 { AS&xR7^z H7b8a!z0 cout<<"This is A"<<endl;51Testing软件测试网8Kv.t\%`9y } 8I`@C1p${&c9N(Z0};51Testing软件测试网7T#M+nV,] C`,^ class B:public A{ ol@v!bzM0public:51Testing软件测试网^ r(j P(WF7RV7j void print() i8Z/V4qwW0 {51Testing软件测试网r,pTUi cout<<"This is B"<<endl; %wz(h?#V"t0 } 0]n'X"ajmIz#mX0}; nk1L[J0int main(){ //为了在以后便于区分,我这段main()代码叫做main1 51Testing软件测试网 @ nw#sI7m A a; E|#v Z4o/we2[5y0 B b; @0]T#z%xSi0 a.print();51Testing软件测试网)Gb&r}!J b.print(); SCGFJ7E0~#A4_0} |
输出:This is A51Testing软件测试网iDZ.dia0g#_
51Testing软件测试网bU(I#J@dxS*PwThis is B51Testing软件测试网:_)G%tc;M Y1M
&e\;U9u(tQN({J-j&p)I4G5H0 2)按照多态的操作对象方式:通过父类对象来操作子类对象51Testing软件测试网 YGYB(|JV'k
FIh`h#X0
nh*[0e{$MM!`0#include <iostream>51Testing软件测试网@.ss-iF]%f using namespace std;51Testing软件测试网(F#t:^1P3T0b class A{51Testing软件测试网y)b@#FS!P+TD public:51Testing软件测试网!?AKQ?9]E void print() %H3` KR)l2I3n!Jax;W0 {51Testing软件测试网Pt*\o'M?.O$T\ cout<<"This is A"<<endl; ;AY.m*^O:Z }1l E!Jl0 } *e+[GPe \jg:` F0}; Hgil}0class B:public A{51Testing软件测试网}CH#?"Y.zE oP public: u|6f$pOa/|0 void print() v0m*~\5D:nIm0 { NX] RSm0 cout<<"This is B"<<endl; q+[j7Jl7S'wlI0 }51Testing软件测试网oz9j K [_ };51Testing软件测试网:t5wJf9eYp int main(){ //通过父类来操作子类51Testing软件测试网j"oXcr0u^l#b A a; Mz3xV+e3Q J4C#r9C_0 B b; '_[[SF#d{0Wv0 A* p1=&a; 9Y JkfYAFC0 A* p2=&b; h0S:zTv3\&r0 p1->print(); /Wq:N3Zo*j1fI0 p2->print(); 4l EXDh*{)^o];M6^P0} |
输出:This is A
"N%h3U)b2]E051Testing软件测试网I4bC8|6oC$K)}This is A51Testing软件测试网vY {?D*]-T
eIM3X B:~ `0 这跟我们预期的不一样。51Testing软件测试网?XsO+R[~%@p"I T
3)采用多态,就是在父类函数前面加上virtual:y p \%^3r0 根据不同的类对象,调用其相应的函数,这个函数就是虚函数51Testing软件测试网fF Jz8AUJW?
51Testing软件测试网*L'V|?L6PsI(HqC6l*~'GWP,H0#include <iostream> `,Inr+EZ0l [#S0using namespace std;51Testing软件测试网4PBDN-nQi x6{a class A{51Testing软件测试网} |n ]g public:51Testing软件测试网$```M,a/G ^6Z0Q virtual void print() {/S.s x\\3B-n&a0 {51Testing软件测试网!Pr SCpL"j cout<<"This is A"<<endl;51Testing软件测试网,uns|'hh)Ut } )k4Er o$Zi`0}; 2t{0wMS3eWN0class B:public A{51Testing软件测试网g N Jl9k?1\x public:51Testing软件测试网c\m/U6P void print()51Testing软件测试网'J$~7o,fG8Guue {51Testing软件测试网(V'vegMl"cta+J cout<<"This is B"<<endl;51Testing软件测试网e%B I+Nh@ }51Testing软件测试网W!J R9cj%~/e };51Testing软件测试网%|Xf8z2oEd int main(){ //通过父类来操作子类 L k-d8ey)Uy.n)j1}W0 A a; |