多態與虛函數,純虛函數的概念

首先,在瞭解什麼是多態之前,要了解什麼是虛函數,虛函數對於多態具有決定性的作用,有虛函數才能構成多態。怎麼樣創建一個含有虛函數的類呢,其實就是函數類型前面加上關鍵字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) 只有類中的虛函數才能被聲明爲純虛成員函數,普通成員函數和頂層函數均不能聲明爲純虛函數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章