純虛函數(shù):純虛函數(shù)是在基類中聲明的虛函數(shù)眷柔,它在基類中沒有定義期虾,但要求任何派生類都要定義自己的實(shí)現(xiàn)方法。在基類中實(shí)現(xiàn)純虛函數(shù)的方法是在函數(shù)原型后加“=0”.純虛函數(shù)不能實(shí)例化對(duì)象驯嘱。
虛函數(shù):虛函數(shù)是C++中用于實(shí)現(xiàn)多態(tài)(polymorphism)的機(jī)制镶苞。核心理念就是通過基類訪問派生類定義的函數(shù),是C++中多態(tài)性的一個(gè)重要體現(xiàn)。利用基類指針訪問派生類中的虛函數(shù)鞠评,這種情況下采用的是動(dòng)態(tài)綁定技術(shù)茂蚓。
動(dòng)態(tài)綁定:基類指針是調(diào)用派生類的中的成員函數(shù)還是調(diào)用基類中的成員函數(shù)要到程序運(yùn)行時(shí)確定。主要看此時(shí)基類指針?biāo)赶虻膶?duì)象。
這里要涉及一些很重要的概念聋涨,也是我最近看完Effective C++才明白的東西晾浴,記錄下來。這些概念就是靜態(tài)類型和動(dòng)態(tài)類型牍白,靜態(tài)綁定和動(dòng)態(tài)綁定脊凰。靜態(tài)綁定和動(dòng)態(tài)綁定。靜態(tài)綁定是說前期綁定茂腥。
所謂對(duì)象的靜態(tài)類型狸涌,就是它在程序中被聲明的時(shí)候采用的類型。
考慮下面的class繼承體系:
class Shape{
virtual void draw(color = Red) const=0;
...
...
};
class Rectangle:public Shape{
virtual void draw(color = Red) const;
...
...
}最岗;
class Circle:public Shape
{
virtual void draw(color = Red) const;
...
...
};
現(xiàn)在考慮以下這些指針:
Shape* ps;//靜態(tài)類型為Shape*
Shape*pc =new Circle;//靜態(tài)類型Shape*
Shape*pr = new Rectangle;//靜態(tài)類型Shape*
在本例中帕胆,ps,pc,pr都被聲明為Shape*類型的,所以它們的靜態(tài)類型都是Shape*般渡。注意:無論它們真正指向什么懒豹,它們的靜態(tài)類型都是Shape*.
所謂的對(duì)象的動(dòng)態(tài)類型是指“當(dāng)前所指對(duì)象的類型”。也就是說诊杆,動(dòng)態(tài)類型可以表現(xiàn)出一個(gè)對(duì)象將會(huì)有什么行為歼捐。根據(jù)上面的例子何陆,pc的動(dòng)態(tài)類型是Circle*晨汹,pr的動(dòng)態(tài)類型是Rectangle*。ps沒有動(dòng)態(tài)類型贷盲,因?yàn)樗鼪]有指向任何對(duì)象淘这。
動(dòng)態(tài)類型一如其名所示,可以在執(zhí)行過程中改變(通常是經(jīng)過賦值運(yùn)算):
ps=pc; \\ps的動(dòng)態(tài)類型如今是Circle*
ps=pr; \\ps的動(dòng)態(tài)類型如今是Rectangle*
Virtual函數(shù)系動(dòng)態(tài)綁定而來巩剖,意思是調(diào)用一個(gè)virtual函數(shù)的時(shí)候铝穷,究竟調(diào)用的是哪一個(gè)函數(shù)代碼,取決于發(fā)出調(diào)用的那個(gè)對(duì)象的動(dòng)態(tài)類型佳魔。
ps->draw(); \\調(diào)用的是Rectangle::draw(Red)