多態是指發出同樣的消息被不同類型的對象接收時產生完全不同的行為,簡單的說就是“一個接口,多種算法”。C++語言支持兩種多態性,一種是編譯時的多態,另一種是運行時的多態性。函數和運算符重載是在編譯時完成,稱之為靜態多態,也稱靜態聯編。運行時的多態性是通過虛函數實現,用虛函數實現的多態性稱為動態多態,也稱動態聯編。
虛函數
虛函數的定義格式
在一個類中用關鍵字virtual說明在成員函數稱為虛函數,其定義的格式如下:
virtual? 函數類型 函數名(形參表)
{
函數體
}
定義虛函數就是為了實現多態類。在基類中某個成員函數被聲明為虛函數后,這個成員函數通常要在派生類中被重新定義,否則定義虛函數就沒有意義。在派生類中重新定義虛函數時,其函數原型必須與基類中的原型完全相同,否則編譯時會出錯或被當作函數重載處理。如果在基類中說明了虛函數,在它的派生類中與基類中虛函數說明相同的函數一定是虛函數,可以省略關鍵字virtual。
虛析構函數
析構函數是在該類對象消亡之前進行一些必要的清理工作,對于動態綁定的虛 函數必須用虛析構函數進行釋放。
純虛函數和抽象類
1、
純虛函數
純虛函數是一鐘特殊的虛函數,它只有函數的聲明,并沒有具體實現函數的功能。它的一般格式如下:
virtual <函數返回類型><虛函數名稱><參數列表>=0;
例:
#include<iostream.h>
class shape
{
public:
?shape(double dfx=0.0,double dfy=0.0);
??virtual void draw()=0;//純虛函數
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<<"繪制一條直線,第一點坐標為:("
??<<firstx<<","<<firsty<<"),第二點坐標為:("<<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<<"繪制一個圓,圓心坐標為:("
??<<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);
}
抽象類
帶有純虛函數的類也稱為抽象類。在繼承體系中,抽象類不能位于底層,它必須有派生類,并且其派生類中必須對抽象類中的純虛函數有具體的實現。一般,抽象類只是撕碎一些通用的操作接口,具體的實現由其派生類完成。