多態(tài)是指發(fā)出同樣的消息被不同類型的對象接收時產(chǎn)生完全不同的行為,簡單的說就是“一個接口,多種算法”。C++語言支持兩種多態(tài)性,一種是編譯時的多態(tài),另一種是運(yùn)行時的多態(tài)性。函數(shù)和運(yùn)算符重載是在編譯時完成,稱之為靜態(tài)多態(tài),也稱靜態(tài)聯(lián)編。運(yùn)行時的多態(tài)性是通過虛函數(shù)實現(xiàn),用虛函數(shù)實現(xiàn)的多態(tài)性稱為動態(tài)多態(tài),也稱動態(tài)聯(lián)編。
虛函數(shù)
虛函數(shù)的定義格式
在一個類中用關(guān)鍵字virtual說明在成員函數(shù)稱為虛函數(shù),其定義的格式如下:
virtual? 函數(shù)類型 函數(shù)名(形參表)
{
函數(shù)體
}
定義虛函數(shù)就是為了實現(xiàn)多態(tài)類。在基類中某個成員函數(shù)被聲明為虛函數(shù)后,這個成員函數(shù)通常要在派生類中被重新定義,否則定義虛函數(shù)就沒有意義。在派生類中重新定義虛函數(shù)時,其函數(shù)原型必須與基類中的原型完全相同,否則編譯時會出錯或被當(dāng)作函數(shù)重載處理。如果在基類中說明了虛函數(shù),在它的派生類中與基類中虛函數(shù)說明相同的函數(shù)一定是虛函數(shù),可以省略關(guān)鍵字virtual。
虛析構(gòu)函數(shù)
析構(gòu)函數(shù)是在該類對象消亡之前進(jìn)行一些必要的清理工作,對于動態(tài)綁定的虛 函數(shù)必須用虛析構(gòu)函數(shù)進(jìn)行釋放。
純虛函數(shù)和抽象類
1、
純虛函數(shù)
純虛函數(shù)是一鐘特殊的虛函數(shù),它只有函數(shù)的聲明,并沒有具體實現(xiàn)函數(shù)的功能。它的一般格式如下:
virtual <函數(shù)返回類型><虛函數(shù)名稱><參數(shù)列表>=0;
例:
#include<iostream.h>
class shape
{
public:
?shape(double dfx=0.0,double dfy=0.0);
??virtual void draw()=0;//純虛函數(shù)
protected:
?double firstx;
?double firsty;
};
shape::shape(double dfx,double dfy)
{
?firstx=dfx;
?firsty=dfy;
}
//直線類
class line:public shape
{
public:
?line(double dfx=0.0,double dfy=0.0,double dsx=0.0,double dsy=0.0);
?void draw();
protected:
?double secondx;
?double secondy;
};
line::line(double dfx,double dfy,double dsx,double dsy):shape(dfx,dfy)
{
?secondx=dsx;
?secondy=dsy;
}
void line::draw()
{
?cout<<"繪制一條直線,第一點坐標(biāo)為:("
??<<firstx<<","<<firsty<<"),第二點坐標(biāo)為:("<<secondx<<","<<secondy<<")"<<endl;
}
class circle:public shape
{
public:
?circle(double dfx=0.0,double dfy=0.0,double dr=0.0);
?void draw();
protected:
?double radius;
};
circle::circle(double dfx,double dfy,double dr):shape(dfx,dfy)
{
?radius=dr;
}
void circle::draw()
{
?cout<<"繪制一個圓,圓心坐標(biāo)為:("
??<<firstx<<","<<firsty<<"),圓的半徑為:"
??<<radius<<endl;
}
void drawing(shape *ps)
{
?ps->draw();
}
void main()
{
?line l(1.0,1.0,9.8,15.2);
?circle c(2.0,3.0,12.4);
?drawing(&l);
?drawing(&c);
}
抽象類
帶有純虛函數(shù)的類也稱為抽象類。在繼承體系中,抽象類不能位于底層,它必須有派生類,并且其派生類中必須對抽象類中的純虛函數(shù)有具體的實現(xiàn)。一般,抽象類只是撕碎一些通用的操作接口,具體的實現(xiàn)由其派生類完成。