日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++中的多态(一)

發布時間:2024/4/11 c/c++ 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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:修飾虛函數,表示該虛函數不能再被繼承

class Car { public:virtual void Drive() final {} };class Benz :public Car { public:virtual void Drive() {cout << "Benz-舒適" << endl;} };
  • override: 檢查派生類虛函數是否重寫了基類某個虛函數,如果沒有重寫編譯報錯
  • class Car{ public:virtual void Drive(){} };class Benz :public Car { public:virtual void Drive() override {cout << "Benz-舒適" << endl;} };
  • 重載、覆蓋(重寫)、隱藏(重定義)的對比
  • 三、抽象類

    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++中的多态(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。