【C++ Primer】类的多态
上一篇 / 下一篇 2012-07-12 13:17:34 / 个人分类:C++
"OLto'X3p#N)I0 一、概述
]9N"`:i ^*ai&UrA051Testing软件测试网t Y,^*o,g)\$WK*\1)接口的多种不同的实现方式即为多态。51Testing软件测试网,x(r1D+c^8];d
51Testing软件测试网c-\(m JdD[4n]\z2)多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式 运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。多态性在C++中都是通过虚函数(Virtual Function) 实现的。
s3`4J4@_$zL6d|Y0x7|wQ,vMC0 3)关键点:多态还有个关键之处就是一切用指向基类的指针或引用来操作对象
)g w8^F#?g)X bP$OT051Testing软件测试网w&C2Gh)WftL二、示例51Testing软件测试网JjV UoC)[
51Testing软件测试网fGC0?yHs1)普通的对象操作方式
4kZo3_OT0;mo#N&x7e-f/b0
+b0G'V3r(p/T'M@0#include <iostream> E3Vfsu0using namespace std;51Testing软件测试网,k@,`*rTAb class A{51Testing软件测试网0K V.V0jm public:51Testing软件测试网 v[x| D void print() +|9[sO3n eVu3j#^ J0 { uQO^Xd)}0 cout<<"This is A"<<endl;51Testing软件测试网J.x5~6JS1r1P} }51Testing软件测试网bH*N@B*t3I;v }; ,Y'hb WB0class B:public A{51Testing软件测试网C Yt4G ^P public: fR2](F!]0 void print() C)bRib,FZ N4V0 {51Testing软件测试网*\m!JAb`i.n/w cout<<"This is B"<<endl; 7o0lA U}q2f0 }51Testing软件测试网D'sF+v8c*onG8G };51Testing软件测试网,RPzO0hE:?0S#u int main(){ //为了在以后便于区分,我这段main()代码叫做main1 "Hc`.p }:Ip3p0 A a; ac]{}QaM I0 B b;51Testing软件测试网#B/@9@U? a.print(); ,J:?p~ k q m%L$l/[#[0 b.print();51Testing软件测试网mfm,C8@qu)j9_ } |
%\OO/R;F0 输出:This is A51Testing软件测试网S `1A9o[!B+Nn
51Testing软件测试网,F#Hz#\"^ FThis is B
RuK:XwPN!J5q~051Testing软件测试网c)\:an*lu4L)J2)按照多态的操作对象方式:通过父类对象来操作子类对象51Testing软件测试网4nP*E["} M
;]H{ `;o7j7Z L051Testing软件测试网cP1jZ K%e\
#include <iostream> [VaR_]`0using namespace std; v5X(O+z:oO"Pz D0class A{51Testing软件测试网;vvG h7N$~ public: F"nJ[qEv0 void print() 'H"}$Qo"i@_Im.G0 { 4`*j$?pV$wLwTh0 cout<<"This is A"<<endl; 'Q+l-a)~ J;y0 } $I6`~(H }^ })L.r0}; 6DbWP&P;E0s.Jh0class B:public A{51Testing软件测试网j SZ_ G public:51Testing软件测试网VVns%n+Sq8N }n.UK void print() q}7MQ`a0 {51Testing软件测试网 m.R\F-h cout<<"This is B"<<endl; *Zu3f2Z,X)XqQ"d0 } T${5^g/B lx8vJ0}; 1W&b(x;J4^#A0int main(){ //通过父类来操作子类 Z1i%]lx0 A a; G#q+T1d.YxC0X0S^EGn0 B b; Ov3G3mC6U$I4T\0 A* p1=&a; /jMF xl'TuG4Om0 A* p2=&b;51Testing软件测试网/\!Z,_#S c+xhN FW p1->print();51Testing软件测试网'R6Ys0Es1E6Bsm p2->print();51Testing软件测试网 ?p5_SJMkS;G7K } |
输出:This is A51Testing软件测试网mBh#F+k\|/o
QGTjF0 This is A
(jJtgg6[DY03i,bV+K*Ik,Ng8`d0 这跟我们预期的不一样。
:P;e#x&EP#di0 3)采用多态,就是在父类函数前面加上virtual51Testing软件测试网#Q\6zylOL/`根据不同的类对象,调用其相应的函数,这个函数就是虚函数51Testing软件测试网V"QW-U7fT
J-S2s._Ay_n.A,Cy&V0
-~i!M,hp~Nx0#include <iostream>51Testing软件测试网9l0Odz
Q using namespace std;51Testing软件测试网&V-d(d&VG class A{51Testing软件测试网wO,A.BrgO%B public:51Testing软件测试网-~yVI,b`Nl~ virtual void print() ]PYx6uB Q0 {51Testing软件测试网i,?zi.A cout<<"This is A"<<endl;51Testing软件测试网+FB)h(r9V:Iz }51Testing软件测试网W c\v*oE }; 6N ];E/KOmq{@6L0class B:public A{51Testing软件测试网4em`;R |.vB Q _ public:51Testing软件测试网KU6L)`e u+Y void print() f;^+|{.z%r ]r;g~#v0 { :w{5yqx4} N(v? A0 cout<<"This is B"<<endl;51Testing软件测试网~'hX8R'{6w.u }51Testing软件测试网*P9c#L xS0re7`S };51Testing软件测试网Vm8mh\0\2I w3s int main(){ //通过父类来操作子类 pId*X$G(yP*}0 A a; 'FsU7e*L5Vz0 B b; *d/e K6da5h5P~0 A* p1=&a; 5Z8W$A9[4O\0Al}W%\ q0 A* p2=&b;51Testing软件测试网/]{8R9rLj/H#Z3hG p1->print();51Testing软件测试网RK Q+W+t}D)U.};Y p2->print(); \{ J^*`0f3r V0} |
bIe*P|*T.pRdb0 三、虚函数进阶51Testing软件测试网N{)r!{UYdD;P
51Testing软件测试网8P8wxh-Q!lY6HLnvoid (A::*fun)(); //定义一个函数指针
:_0l$MX0T8Pu0}l$F9vBW&_ eI0 A *p=new B;51Testing软件测试网 u@h,u4W
51Testing软件测试网nRK3lW n:F&{,Sfun=&A::fun;//是真正获得虚函数的地址吗? 其实间接获得虚函数地址的一段代码的地址
HMbo!~F!L(wJ051Testing软件测试网9Fq6c)@bw[Y51Testing软件测试网3z#w0KMr'T!sB