多態

c++多態分爲靜態多態和動態多態。

1、靜態多態:靜態多態實現的方式是重載,而重載實現的機制是函數的重命名,與類型函數名是有關係的,達到重名名就達到了重載的效果。

2、動態多態:(一個接口的多種實現)多態實現的前提是有子類、父類,有繼承關係;要調用的函數爲虛函數並且子類要對父類進行重寫;父類的指針或者引用指向父類則調用父類的虛函數,指向子類則調用子類的虛函數。

  也可以理解爲:當使用基類的指針或者引用調用重寫的虛函數時,當指向父類調用的就是父類的虛函數,指向子類調用的就是子類的虛函數。

簡單代碼實現:

class Person
{
public:
	virtual void BuyTickets()
	{
		cout<<"買票"<<endl;
	}
};
class Student:public Person
{
	virtual void BuyTickets()
	{
		cout<<"買半票"<<endl;
	}
};
void Fun(Person &B)
{
	B.BuyTickets();
}
int main()
{
	Person p;
	Student s;
	Fun(p);
	Fun(s);
}

在多態中需要注意的問題:

1. 派生類重寫基類的虛函數實現多態,要求函數名、參數列表、返回值完全相同。(協變除外)

2. 基類中定義了虛函數,在派生類中該函數始終保持虛函數的特性。

3. 只有類的成員函數才能定義爲虛函數。

4. 靜態成員函數不能定義爲虛函數。

5. 如果在類外定義虛函數,只能在聲明函數時加virtual,類外定義函數時不能加virtual。

6. 構造函數不能爲虛函數,雖然可以將operator=定義爲虛函數,但是最好不要將operator=定義爲虛函數,因爲容易使用時容易引

起混淆。

7. 不要在構造函數和析構函數裏面調用虛函數,在構造函數和析構函數中,對象是不完整的,可能會發生未定義的行爲。

8. 最好把基類的析構函數聲明爲虛函數:因爲派生類的成員來自兩部分,一個是從基類繼承的,一個是它自己本身定義的。實例化對象時利用基類的構造函數初始化從基類繼承下來的,派生類的構造函數實例化自己定義的那部分,所以,派生類的析構函數只會析構自己定義的那部分,如果基類的析構函數不是虛函數,則基類的析構函數不能析構從基類繼承下來的那部分,就會出現只刪一半的現象。

純虛函數

在成員函數的形參後面寫上=0,則成員函數爲純虛函數。包含純虛函數的類叫做抽象類(也叫接口類),抽象類不能實例化出對象。純虛

函數在派生類中重新定義以後,派生類才能實例化出對象。


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