首先,在瞭解什麼是多態之前,要了解什麼是虛函數,虛函數對於多態具有決定性的作用,有虛函數才能構成多態。怎麼樣創建一個含有虛函數的類呢,其實就是函數類型前面加上關鍵字virtual,藉助虛函數,基類指針既可以使用基類的成員函數,也可以使用派生類的成員函數,它有多種形態,或多種表現方式,這就是多態。
多態是面向對象的主要特徵之一。在C++中,虛函數的唯一用處就是構成多態。
C++提供多態的目的是:可以通過基類指針對所有派生類(包括直接派生和間接派生)的成員變量和成員函數進行“全方位”的訪問,尤其是成員函數。如果沒有多態,我們只能訪問成員變量。
構成多態的條件
即多態存在的三個條件:
必須存在繼承關係;
繼承關係中必須有同名的虛函數,並且它們是覆蓋關係(重載不行)。
存在基類的指針,通過該指針調用虛函數。
注意:派生類中的虛函數必須覆蓋(不是重載)基類中的虛函數,才能通過基類指針訪問。
#include<iostream>
using namespace std;
class my{
public:
virtual void myfun(){ //虛函數
cout<<"abc"<<endl;
}
};
class my1:public my{
public:
void myfun(){
cout<<"abc1"<<endl;
}
};
void main(){
my *p=new my();
p->myfun();
p=new my1();
p->myfun();
system("pause");
}
另外注意:
1.如果想通過基類指針訪問派生類的函數,那麼該函數必須覆蓋基類中的函數,普通函數如此,虛函數也是如此。
2.如果覆蓋的是虛函數,那麼就構成了多態。
3.virtual 關鍵字僅用於函數聲明,如果函數是在類外定義,則不需要再加上virtual關鍵字。
4. 爲了方便,你可以只將基類中的函數聲明爲虛函數,所有派生類中具有覆蓋關係的同名函數都將自動成爲虛函數。
講到虛函數那麼必須要講純虛函數:
在C++中,可以將成員函數聲明爲純虛函數,語法格式爲:
virtual 函數返回類型 函數名 (函數參數) = 0;
純虛函數沒有函數體,只有函數聲明,在虛函數聲明結尾加上=0,表明此函數爲純虛函數。
最後的=0並不表示函數返回值爲0,它只起形式上的作用,告訴編譯系統“這是純虛函數”。
包含純虛成員函數的類稱爲抽象類。之所以說它抽象,是因爲它無法實例化,也就是無法創建對象。原因很明顯,純虛函數沒有函數體,不是完整的函數,無法調用,也無法爲其分配內存空間,也可以說是抽象類就是含有純虛函數的類。
抽象類通常是作爲基類,讓派生類去實現純虛函數。派生類必須實現純虛函數才能被實例化。
class my{
public:
virtual void show()=0; //純虛函數
private:
protected:
};
class my1:public my{
public:
void show(){
cout<<"純虛函數"<<endl;
}
};
void main(){
//my *p=new my();錯誤 純虛函數默認抽象類,不允許創建對象。
my1 *p=new my1();
p->show();
system("pause");
}
關於純虛函數的幾點說明:1) 一個純虛成員函數就可以使類成爲抽象基類,但是抽象基類中除了包含純虛成員函數外,還可以包含其它的成員函數(虛函數或普通函數)和成員變量。
2) 只有類中的虛函數才能被聲明爲純虛成員函數,普通成員函數和頂層函數均不能聲明爲純虛函數。