類的成員函式前面加上virtual關鍵字,那麼成員函式就變成了虛函式。
當在子類定義了乙個與父類完全相同(函式名相同、引數相同、返回值相同、協變除外)的虛函式時,那麼子類的虛函式就重寫(覆蓋)了父類的虛函式。當使用基類的指標或者引用呼叫重寫的虛函式時,指向父類就呼叫父類的虛函式,指向子類則呼叫子類的虛函式,這種現象叫做多型
多型的條件:1、父類指標和引用。
2、呼叫的函式必須是重寫的虛函式。
#include
using
namespace
std;
class person
protected:
string _name;
};class student
protected:
int _num;
};void test(person& p)
int main()
#include
using
namespace
std;
class person
protected:
string _name;
};class student
protected:
int _num;
};void test(person& p)
int main()
注意:父類的函式定義時有virtual.子類的函式沒有virtual但是其他都相同,也同樣構成重寫。
總結:過載:在同一作用域,函式名相同引數不同;返回值可以不同。1、派生類重寫基類的虛函式實現多型,要求函式名、引數列表、返回值都相同(除了協變)
2、基類中定義了虛函式,在派生類中該函式始終保持虛函式的特性
3、只有類的成員函式才能定義成虛函式。
4、靜態成員函式不能定義成虛函式
5、如果需要在類外定義虛函式,那就要在類內部宣告成vitual+函式。
6、建構函式不能定義成虛函式(operator=雖然可以,但不提倡)
7、建構函式中不要呼叫虛函式,因為此時物件很有可能還沒有構造出來;析構函式中也不可以,因為有可能物件已經釋放。
8、最好將父類的析構函式定義成虛函式(why?派生類和基類的析構函式雖然看著名稱不同,但是會變會處理成相同的函式,所以寫成虛函式,就可以達到a* p=new b;delete p只釋放了父類,就會造成記憶體洩漏,就必須要重寫析構函式)。
重寫(覆蓋):不同作用域(基類和派生類);函式名相同;引數列表相同;返回值相同(協變除外)。基類中成員函式必須有virtual關鍵字;訪問修飾符可以不同。
重定義(隱藏):不同作用域;函式名相同,在基類和父類中只要不構成重寫就是重定義
在成員函式的形參後面加上=0,就形成了純虛函式,具有純虛函式的類叫做抽象類抽象類不能例項化出物件,只有在派生類中重新定義以後,才能例項化出物件。
class person;
static成員在整個體系中只有乙個,是所有物件共享的,無論繼承多少次,都只能有乙個static成員例項
多型和虛函式
在c 中,多型是通過虛函式實現的。基類如果把乙個函式宣告為虛的 virtual 就表明繼承類可以覆蓋 override 這個函式 從而表現不同的行為,呈現出多型性 對於每乙個有虛函式的類,或者覆蓋了乙個或多個基類虛函式的繼承類,可認為有乙個與之關聯的虛函式表 v table v table 表中的每...
虛函式和多型
虛函式的概念 在類的成員函式前加virtual關鍵字,這個成員函式稱為虛函式。虛函式重寫 當在子類的定義了乙個與父類完全相同的虛函式時,則稱子類的這個函式重寫 也稱覆蓋 了父類的這個虛函式。include using namespace std class person public virtual...
虛函式和多型
pragma once 普通飛機 class plane include plane.h include using namespace std void plane fly void plane land pragma once include plane.h 直公升飛機 class jet pu...