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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

C++总结笔记(九)—— 多态

發(fā)布時(shí)間:2023/12/10 c/c++ 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++总结笔记(九)—— 多态 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 一、多態(tài)是什么?
  • 二、使用步驟
    • 2.1. 靜態(tài)多態(tài)
      • 2.1.1 函數(shù)重載
      • 2.1.2 模板
    • 2.2.動(dòng)態(tài)多態(tài)
      • 2.2.1 示例
      • 2.2.2 原理分析
  • 總結(jié)


一、多態(tài)是什么?

多態(tài)是面向?qū)ο蟮恼Z(yǔ)言中都必須掌握的特性,其概念簡(jiǎn)單講就是對(duì)同一種特性的方法有不同的實(shí)現(xiàn)功能,例如玩手機(jī)這個(gè)方法,有人玩抖音,有人玩LOL等等種不同的應(yīng)用形式。
多態(tài)可以按照綁定分為靜態(tài)多態(tài)動(dòng)態(tài)多態(tài)
綁定是指函數(shù)體與函數(shù)調(diào)用完成關(guān)聯(lián)的過程。
靜態(tài)多態(tài)是指在程序編譯期間就完成,一般通過函數(shù)重載模板來完成,會(huì)根據(jù)函數(shù)實(shí)參的類型或個(gè)數(shù)來選擇那個(gè)函數(shù)來實(shí)現(xiàn)。
動(dòng)態(tài)多態(tài)是指在程序編譯后完成的聯(lián)編,通過虛方法的形式完成,根據(jù)引用對(duì)象的實(shí)際類型調(diào)用相應(yīng)的方法。其原理就是用父類的虛函數(shù)指針去調(diào)用子類中被重寫的方法

二、使用步驟

2.1. 靜態(tài)多態(tài)

2.1.1 函數(shù)重載

下面為構(gòu)造函數(shù)重載示例:

class Cat { public:Cat(){cout << "喵是無(wú)參構(gòu)造函數(shù)" << endl;}Cat(string name){Name = name;cout << "喵是有參構(gòu)造函數(shù)" << endl;}//用于拷貝c的屬性值,用常量引用的方式進(jìn)行Cat(const Cat &c){Name = c.Name;cout<< "喵是拷貝構(gòu)造函數(shù)" << endl;}~Cat(){cout << "喵是析構(gòu)函數(shù)" << endl;}string Name;//咪咪名字 };void FindName() {//括號(hào)法Cat cat1;//用默認(rèn)構(gòu)造函數(shù)時(shí),不能加括號(hào),否則編譯器會(huì)當(dāng)作函數(shù)聲明。Cat cat2(cat1);//拷貝構(gòu)造函數(shù)調(diào)用Cat cat3("小300");//有參構(gòu)造函數(shù)調(diào)用。Cat cat4(cat3);//拷貝構(gòu)造函數(shù)調(diào)用cout << "第一個(gè)貓的名字是:" << cat1.Name << endl;cout << "第二個(gè)貓的名字是:" << cat2.Name << endl;cout << "第三個(gè)貓的名字是:" << cat3.Name << endl;cout << "第四個(gè)貓的名字是:" << cat4.Name << endl; }

2.1.2 模板

模板在C++中分為類模板和函數(shù)模板,用template修飾,和泛型的概念很相似。

類模板是通過建立一個(gè)通用類,其中的數(shù)據(jù)成員、成員函數(shù)的返回值類型和形參類型不進(jìn)行具體指定,用一個(gè)虛擬的類型聲明。在使用類模板定義對(duì)象時(shí),系統(tǒng)會(huì)實(shí)參的類型來取代類模板中虛擬類型從而實(shí)現(xiàn)了不同類的功能。

函數(shù)模板也需聲明一個(gè)模板類名,然后在函數(shù)形參中聲明一個(gè)模板類對(duì)象,在進(jìn)行函數(shù)調(diào)用時(shí)會(huì)根據(jù)實(shí)參的類型來覆蓋模板類。

函數(shù)模板調(diào)用規(guī)則:
1.如果函數(shù)模板和普通函數(shù)都可以實(shí)現(xiàn)功能的話優(yōu)先調(diào)用普通函數(shù)。
2.可以通過空模板參數(shù)列表來強(qiáng)制調(diào)用函數(shù)模板。
3.函數(shù)模板可以發(fā)生重載。
4.如果函數(shù)模板可以產(chǎn)生更好的匹配,優(yōu)先調(diào)用函數(shù)模板。

類模板和函數(shù)模板的區(qū)別:
1:類模板沒辦法對(duì)聲明的模板類對(duì)象進(jìn)行自動(dòng)推導(dǎo)類型,必須用指定類型,函數(shù)模板可以。
2:類模板在模板參數(shù)聲明時(shí)可以有默認(rèn)參數(shù)類型,比如在聲明構(gòu)造函數(shù)時(shí)一個(gè)形參為模板類型,一個(gè)為int類型。

類模板

#include <iostream> #include<string> using namespace std;template<class T1, class T2>class Person { public:Person(T1 name, T2 age){this->m_age = age;this->m_name = name;}void showPerson(){cout << m_name <<" "<< m_age << endl;}private:T1 m_name;T2 m_age; };int main() {Person<string, int> p("張三", 1);p.showPerson();system("pause");return 0; }

函數(shù)模板

#include <iostream> using namespace std;template<class T>//T的類型需要一致,選擇排序 void Sort(T arr[], int l) {for (int i = 0; i < l; i++){int max = i;for (int j = i + 1; j < l; j++){if (arr[max] > arr[j]){max = j;}}if (max != i){T temp = arr[max];arr[max] = arr[i];arr[i] = temp;}} }int main() {int Array[] = {1,4,35,24,213,2132};int num = sizeof(Array) / sizeof(int);Sort(Array, num);//Sort<>(Array, num);//空模板參數(shù)列表for(int i = 0; i< num; i++){cout << Array[i] << endl;}system("pause");return 0; }

2.2.動(dòng)態(tài)多態(tài)

動(dòng)態(tài)多態(tài)需滿足以下條件:
1.類之間存在繼承關(guān)系
2. 調(diào)用函數(shù)的對(duì)象必須是指針或者引用。
3.子類重寫父類函數(shù)(函數(shù)返回值、名稱和參數(shù)列表相同)

2.2.1 示例

#include<iostream> using namespace std;class Student { public://虛函數(shù)virtual void play(){cout << "我在玩手機(jī)" << endl;}//純虛函數(shù),純虛函數(shù)的類為抽象類,類無(wú)法實(shí)例化/*virtual void play() = 0;*///父類寫虛析構(gòu)函數(shù)virtual ~Student(){} };class Student1 :public Student { public:Student1(string app){APP = new string(app);}void play(){cout << "我在刷" << *APP << endl;}//如果沒有在堆區(qū)開辟內(nèi)存的化,不用寫~Student1(){if (APP != NULL){delete APP;APP = NULL;}}private:string *APP; };class Student2 :public Student { public:Student2(string app){APP = new string(app);}void play(){cout << "我在玩" << *APP << endl;}~Student2(){if (APP != NULL){delete APP;APP = NULL;}} private:string* APP; };int main() {//父類指針在調(diào)用自身的析構(gòu)函數(shù)時(shí),不會(huì)調(diào)用子類的析構(gòu),從而造成內(nèi)存泄露,所以要改為虛析構(gòu)的方法。Student* s1 = new Student1("抖音");s1->play();delete s1;Student* s2 = new Student2("LOL");s2->play();delete s2; }

2.2.2 原理分析

同樣可以使用開發(fā)者工具進(jìn)行分析。

其中vfptr指的是虛函數(shù)指針,vftable指的是虛函數(shù)表,父類子類中均存在虛函數(shù)指針和表,其中指針指向虛函數(shù)表。在進(jìn)行虛函數(shù)的重寫時(shí),就會(huì)產(chǎn)生子類的虛函數(shù)指針,通過聲明父類指針或引用調(diào)用函數(shù)時(shí),就會(huì)覆蓋vftable中類名,指向?qū)?yīng)子類中的重寫方法。


總結(jié)

多態(tài)的概念使C++的編程非常靈活,需要特別注意開閉原則和內(nèi)存管理。

總結(jié)

以上是生活随笔為你收集整理的C++总结笔记(九)—— 多态的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。