C++總結筆記(九)—— 多態

文章目錄

  • 一、多態是什么?
  • 二、使用步驟
    • 2.1. 靜態多態
      • 2.1.1 函數重載
      • 2.1.2 模板
    • 2.2.動態多態
      • 2.2.1 示例
      • 2.2.2 原理分析
  • 總結


一、多態是什么?

多態是面向對象的語言中都必須掌握的特性,其概念簡單講就是對同一種特性的方法有不同的實現功能,例如玩手機這個方法,有人玩抖音,有人玩LOL等等種不同的應用形式。
多態可以按照綁定分為靜態多態動態多態
綁定是指函數體與函數調用完成關聯的過程。
靜態多態是指在程序編譯期間就完成,一般通過函數重載模板來完成,會根據函數實參的類型或個數來選擇那個函數來實現。
動態多態是指在程序編譯后完成的聯編,通過虛方法的形式完成,根據引用對象的實際類型調用相應的方法。其原理就是用父類的虛函數指針去調用子類中被重寫的方法

二、使用步驟

2.1. 靜態多態

2.1.1 函數重載

下面為構造函數重載示例:

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

2.1.2 模板

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

類模板是通過建立一個通用類,其中的數據成員、成員函數的返回值類型和形參類型不進行具體指定,用一個虛擬的類型聲明。在使用類模板定義對象時,系統會實參的類型來取代類模板中虛擬類型從而實現了不同類的功能。

函數模板也需聲明一個模板類名,然后在函數形參中聲明一個模板類對象,在進行函數調用時會根據實參的類型來覆蓋模板類。

函數模板調用規則:
1.如果函數模板和普通函數都可以實現功能的話優先調用普通函數。
2.可以通過空模板參數列表來強制調用函數模板。
3.函數模板可以發生重載。
4.如果函數模板可以產生更好的匹配,優先調用函數模板。

類模板和函數模板的區別:
1:類模板沒辦法對聲明的模板類對象進行自動推導類型,必須用指定類型,函數模板可以。
2:類模板在模板參數聲明時可以有默認參數類型,比如在聲明構造函數時一個形參為模板類型,一個為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;
}

函數模板

#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);//空模板參數列表for(int i = 0; i< num; i++){cout << Array[i] << endl;}system("pause");return 0;
}

2.2.動態多態

動態多態需滿足以下條件:
1.類之間存在繼承關系
2. 調用函數的對象必須是指針或者引用。
3.子類重寫父類函數(函數返回值、名稱和參數列表相同)

2.2.1 示例

#include<iostream>
using namespace std;class Student
{
public://虛函數virtual void play(){cout << "我在玩手機" << endl;}//純虛函數,純虛函數的類為抽象類,類無法實例化/*virtual void play() = 0;*///父類寫虛析構函數virtual ~Student(){}
};class Student1 :public Student
{
public:Student1(string app){APP = new string(app);}void play(){cout << "我在刷" << *APP << endl;}//如果沒有在堆區開辟內存的化,不用寫~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()
{//父類指針在調用自身的析構函數時,不會調用子類的析構,從而造成內存泄露,所以要改為虛析構的方法。Student* s1 = new Student1("抖音");s1->play();delete s1;Student* s2 = new Student2("LOL");s2->play();delete s2;
}

2.2.2 原理分析

同樣可以使用開發者工具進行分析。
在這里插入圖片描述
其中vfptr指的是虛函數指針,vftable指的是虛函數表,父類子類中均存在虛函數指針和表,其中指針指向虛函數表。在進行虛函數的重寫時,就會產生子類的虛函數指針,通過聲明父類指針或引用調用函數時,就會覆蓋vftable中類名,指向對應子類中的重寫方法。


總結

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/256126.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/256126.shtml
英文地址,請注明出處:http://en.pswp.cn/news/256126.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[轉]c++類的構造函數詳解

c構造函數的知識在各種c教材上已有介紹&#xff0c;不過初學者往往不太注意觀察和總結其中各種構造函數的特點和用法&#xff0c;故在此我根據自己的c編程經驗總結了一下c中各種構造函數的特點&#xff0c;并附上例子&#xff0c;希望對初學者有所幫助。 c類的構造函數詳解 …

結構體對齊問題

#pragma (1)typedef struct {};#pragma ()#pragma pack(1) 的意義是什么skypxl | 瀏覽 27771 次發布于2009-10-01 16:38最佳答案設置結構體的邊界對齊為1個字節&#xff0c;也就是所有數據在內存中是連續存儲的。比如你在C語言中定義下面這樣的結構體&#xff1a;struct s {cha…

【機器學習】——純Python建立BP模型

參考:https://blog.csdn.net/michael_f2008/article/details/103715699 https://developer.aliyun.com/article/614411 import pandas as pd import numpy as np import datetime from sklearn.utils import shuffle# 1.初始化參數 def initialize_parameters(n_x, n_h, n_y…

組件局域網中的無集線器、Windows XP、Windows 7、Windows 8的對等網

為什么要用對等網&#xff1f; 答&#xff1a;對等網采用分散管理的方式&#xff0c;網絡中的每臺計算機既作為客戶機又可作為服務器來工作&#xff0c;每個用戶都管理自己機器上的資源。 組建局域網中無集線器的對等網 組建局域網中Windows XP的對等網 組建局域網中Windows 7的…

datatable綁定comboBox顯示數據[C#]

實現功能&#xff1a;datatable綁定comboBox,在下拉菜單中顯示對應數據 實現方法&#xff1a;    //dataSet 轉 dataTable    1、生成datatable&#xff0c;并為combox綁定數據源&#xff1a;comboBox1.DataSource dt1;comboBox1.DisplayMember "用戶編碼"…

C++總結筆記(十)——堆區內存開辟數組和二級指針

文章目錄一、堆區開辟數組1. 數組指針與指針數組的區別2. 1維數組3. 2維數組二、二級指針一、堆區開辟數組 1. 數組指針與指針數組的區別 數組指針是指指向數組的指針&#xff0c;它的本體是一個指針, 聲明指針變量的時候一般用括號&#xff0c;因為括號的優先級高于[]&#…

阿里巴巴將赴NIPS 2017 3大事業部聯袂展示AI全技能

被譽為國際頂級的機器學習和神經網絡學術會議NIPS 2017將于12月4日-9日在美國加州長灘市舉行。在本屆會議上&#xff0c;阿里巴巴除有兩篇論文入選Workshop并進行Oral和Poster形式報告外&#xff0c;3大技術事業部將連續3天&#xff08;5日-7日&#xff09;在阿里展區舉行多場技…

【圖像處理】——Python實現圖像特征提取BP神經網絡實現圖像二分類

目錄 一、圖像特征提取 二、BP實現圖像二分類 1、輸入層、隱層、輸出層結點個數設置

mysql sql語句大全

1、新建用戶&#xff1a;>CREATE USER name IDENTIFIED BY ssapdrow; 2、更改密碼&#xff1a; >SET PASSWORD FOR namePASSWORD(fdddfd); 3、權限管理 >SHOW GRANTS FOR name; //查看name用戶權限 >GRANT SELECT ON db_name.* TO name;    //給name用戶db_…

C++總結筆記(十一)—— Lambda表達式的應用

文章目錄一、Lambda表達式是什么&#xff1f;二、程序示例1. 在STL中的使用一、Lambda表達式是什么&#xff1f; Lambda表達式時C11引入的語法&#xff0c;本質上是一個匿名函數&#xff0c;用[ ] () {}三個符號組成表達式。 格式為&#xff1a;[capture list] (params list) …

【文件處理】——字典寫入json文件或TXT文件,讀取文件中的字典TypeError: Object of type ‘ndarray‘ is not JSON serializable錯誤解決方法

目錄 一、將字典寫入json文件 二、json文件中讀取字典 三、將字典寫入TXT文件中 四、從TXT中讀取字典 五、解決字典含數組存入json文件失敗的方法 1、存入前將數組變成列表 2、擴展類方法 一、將字典寫入json文件 import jsontest_dict {version: "1.0",exp…

js一些實用例子

1.獲取焦點選中文本內容 $("#id").focus(function(){ this.select(); }); 2.表單提交方式 A.自動提交 setTimeout(function(){表單對象.submit();},2000); B.onclick事件提交(鏈接提交) <input type"submit" value"提交" οnclick"retur…

360安全衛士加速球誤關閉某個應用軟件

近期因為工作原因須要使用金山快盤。但因為之前電腦上安裝了360安全衛士&#xff0c;在使用加速球功能的時候&#xff0c;會出現&#xff0c;誤關閉金山快盤的操作&#xff0c;怎么避免呢&#xff1f; 1、打開360主界面。找到安全防護中心&#xff0c;例如以下圖&#xff1a; 2…

C++STL總結筆記(一)—— 容器和容器適配器

文章目錄前言一、概念1.1 順序容器1.2 容器適配器1.3 關聯容器二、程序示例1. vector和Set自定義數據類型的訪問2.vector容器嵌套3.list容器排序4.pair對組的使用總結前言 STL是C中的基于數據結構和算法的標準模板庫&#xff0c;可以大量節約系統開發時間&#xff0c;增加程序…

【圖像處理】——比特平面原理和實現方法(全網較全面,含所有比特位圖的分層方法)

目錄 一、比特平面 1st比特平面:括號里面的為比特值,前面的是原圖像中對應要變為0的像素值

20145238-荊玉茗 《信息安全系統設計基礎》第7周學習總結

20145238 《信息安全系統設計基礎》第7周學習總結 教材學習內容總結 存儲器系統 : 存儲器系統是一個具有不同容量、成本和訪問時間的存儲設備的層次結構。 1、RAM隨機訪問存儲器 分類&#xff1a;SRAM&#xff08;靜態&#xff09;、DRAM&#xff08;動態&#xff09;特點&…

關于兩個jar包中存在包名和類名都完全相同的jar包沖突問題

2019獨角獸企業重金招聘Python工程師標準>>> 最近弄webservice&#xff0c;我使用的jdk自帶的wsimport工具來生成客戶端代碼&#xff0c;發現生成的代碼具有編譯錯誤&#xff0c;錯誤描述如下&#xff1a; The method getPort(QName, Class<T>) in the type S…

限制文本框只能輸入數字和小數點

<input type"text" class"NumText" placeholder"只能輸入數字&#xff08;可含有小數點&#xff09;"/><style> .NumText{width:200px;} .NumText::-webkit-input-placeholder{color:#F1923C;} .NumText:-moz-placeholder{…

C++STL總結筆記(二)——仿函數(函數對象)

文章目錄一、概念總結一、概念 仿函數又稱函數對象&#xff0c;即重載了函數調用運算符&#xff08;&#xff09;的類的對象。 優勢&#xff1a; 1.仿函數對象的內部可以有自己的狀態&#xff0c;可以實現一些其他的功能。 2.函數對象可以作為參數進行傳遞。 當仿函數類內重載…