C++中的多态(一)
C++中的多態(一)
文章目錄
- C++中的多態(一)
- 一、多態的概念
- 二、虛函數重寫
- 三、抽象類
一、多態的概念
1.多態的概念:通俗來說,就是多種形態,具體點就是去完成某個行為,當不同的對象去完成時會產生出不同的狀態。(即同一事物在不同場景下的不同形態)
2.多態的定義和實現條件:
a. 必須通過基類的指針或者引用調用虛函數
b. 被調用的函數必須是虛函數,且派生類必須對基類的虛函數進行重寫
二、虛函數重寫
1.虛函數:即被virtual修飾的類成員函數稱為虛函數。
2.虛函數重寫:虛函數的重寫(覆蓋):派生類中有一個跟基類完全相同的虛函數(即派生類虛函數與基類虛函數的返回值類型、函數名字、參數列表完全相同),稱子類的虛函數重寫了基類的虛函數。
class Person { public:virtual void BuyTicket() { cout << "買票-全價" << endl; } };class Student : public Person { public:virtual void BuyTicket() { cout << "買票-半價" << endl; } /*注意:在重寫基類虛函數時,派生類的虛函數在不加virtual關鍵字時,雖然也可以構成重寫(因為繼承后 基類的虛函數被繼承下來了在派生類依舊保持虛函數屬性),但是該種寫法不是很規范,不建議這樣使用*/ /*void BuyTicket() { cout << "買票-半價" << endl; }*/ };void Func(Person& p) { p.BuyTicket(); }int main() {Person ps;Student st;Func(ps);Func(st);return 0; }3.虛函數重寫的例外:
- a.協變(基類與派生類虛函數返回值類型不同)
派生類重寫基類虛函數時,與基類虛函數返回值類型不同。即基類虛函數返回基類對象的指針或者引用,派生類虛函數返回派生類對象的指針或者引用時,稱為協變
class A { };class B : public A { };class Person { public:virtual A* f(){return new A;} };class Student : public Person { public:virtual B* f(){return new B;} };- b.析構函數的重寫(基類與派生類析構函數的名字不同)
如果基類的析構函數為虛函數,此時派生類析構函數只要定義,無論是否加virtual關鍵字,都與基類的析構函數構成重寫,雖然基類與派生類析構函數名字不同。雖然函數名不相同,看起來違背了重寫的規則,其實不然,這里可以理解為編譯器對析構函數的名稱做了特殊處理,編譯后析構函數的名稱統一處理成destructor
class Person { public:virtual ~Person(){cout << "~Person()" << endl;} };class Student : public Person { public:virtual ~Student() { cout << "~Student()" << endl; } };// 只有派生類Student的析構函數重寫了Person的析構函數,下面的delete對 //象調用析構函數,才能構成多態,才能保證p1和p2指向的對象正確的調用析構函數。 int main() {Person* p1 = new Person;Person* p2 = new Student;delete p1;delete p2;return 0; }4.關鍵字:
1. final:修飾虛函數,表示該虛函數不能再被繼承
三、抽象類
1.概念:在虛函數的后面寫上 =0 ,則這個函數為純虛函數。包含純虛函數的類叫做抽象類(也叫接口類),抽象類不能實例化出對象。派生類繼承后也不能實例化出對象,只有重寫純虛函數,派生類才能實例化出對象。純虛函數規范了派生類必須重寫,另外純虛函數更體現出了接口繼承
2.舉例:
class Car { public:virtual void Drive() = 0; };class Benz :public Car { public:virtual void Drive(){cout << "Benz-舒適" << endl;} };class BMW :public Car { public:virtual void Drive(){cout << "BMW-操控" << endl;} };void Test() {Car* pBenz = new Benz;pBenz->Drive();Car* pBMW = new BMW;pBMW->Drive(); }總結
以上是生活随笔為你收集整理的C++中的多态(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++中的继承(三)
- 下一篇: C++中多态(二)