多態(tài)體現(xiàn)在父類和派生類之間,通過函數(shù)覆蓋,實(shí)現(xiàn)在運(yùn)行過程中動態(tài)調(diào)用函數(shù)。
必要條件:
(1)父類中將該函數(shù)聲明為virtual
(2)子類中完全一致的覆蓋父類中的函數(shù),要求返回值、函數(shù)名、參數(shù)都一致
(3)通過指針或者借助于函數(shù)來實(shí)現(xiàn)
方法一(利用指針):
#include <iostream.h>
class A
{
public:
virtual void func()
{
cout<<"A::func()"<<endl;
}
}
class B: public A
{
public:
void func()
{
cout<<"B::func()"<<endl;
}
}
void main()
{
A tmp=new B();//A tmp=new B;也行
tmp->func();
B tmp2;
((A *)&tmp2)->func();
}
方法二(利用函數(shù)):
#include <iostream.h>
class A
{
public:
virtual void func()
{
cout<<"A::func()"<<endl;
}
void test()
{
func();//***//
}
}
class B: public A
{
public:
void func()
{
cout<<"B::func()"<<endl;
}
}
void main()
{
B tmp;
tmp.test();
}
對于//***//行,有很多說道,“func();”等價于“this.func()”,能否實(shí)現(xiàn)多態(tài),關(guān)鍵是看這里的this指向父類還是子類,由于this指針必須得指向某個對象,當(dāng)我們用“B tmp”或者“A tmp=new B”構(gòu)造完對象tmp后,由于tmp本質(zhì)上都是一個B的對象,因此該this指針就是指向子類的。