C++複習要點總結之十-多型(一)
多態的理解:
是一個物件導向新需求:
根據實際的物件類型來判斷重寫函數的呼叫
如果父類別指標指向的是父類別物件則呼叫父類別中定義的函數
如果父類別指標指向的是父類別物件則呼叫父類別中定義的函數
如果父類別指標指向的是子類別物件則呼叫子類別中定義的重寫函數
解決方案:
Ø C++中透過virtual關鍵字對多態進行支援
Ø 使用virtual聲明的函數重寫後即可展現多態性特性
//物件導向3大概念
封裝
突破了C語言函數的概念。 。
繼承
程式碼復用 。 。 。 。我復用原來寫好的程式碼。 。 。
多態
多態可以使用未來。 。 。 。 。 80年代寫了一個框架。 。 。 。 。 。 90年代人寫的程式碼
多態是我們軟體產業追尋的一個目標。 。 。
//寫了一個框架,可以呼叫後來人,寫的程式碼的能力
進一步的理解
//間接賦值成立的3個條件:
//1 定義兩個變數。 。 。
//2 建立關聯 。 。 。 。
//3 *p
//多態成立的三個條件:
//1 要有繼承
//2 要有函數重寫。 。 。 C 虛函數
//3 要有父類指標(父類參考)指向子類物件
//多態是設計模式的基礎,多態是框架的基礎
知識點1 虛析構函數
析構函數是為了釋放資源,
當釋放資源時有需求不能直接對物件釋放時如:
C *myC = new C; //C繼承B,B繼承A類
delete myC; / /直接透過子類物件釋放資源這種情況不需要寫virtual 關鍵字
需要透過父類指標將所有的子類都物件的析構函數都執行一遍
想透過父類指標釋放所有的子類資源(需要在最終父類的析構函數中加上virtual關鍵字)
void howtodelete(A *base) { delete base; //这句话不会表现成多态 这种属性 }
知識點2:重載和重寫區別
函數重載
必須在同一類中進行
子函數重載
必須在同一類中進行
子類別無法重載父類別的函數,父類別同名函數會被名稱覆蓋(例如:父類別中有函數a(),子類別中也有函數a(),但是還有函數a(int b)這個函數就是重載父類別函數產生錯誤!類別與子類別中的函數必須有完全相同的原型
使用virtual聲明之後能夠產生多態性(如果不使用virtual,那叫重定義)
多態是在運行期間根據具體物件的類型決定函數調用
範例分析:
//1 C++编译器 看到func名字 ,因子类中func名字已经存在了(名称覆盖).所以c++编译器不会去找父类的4个参数的func函数 //2 c++编译器只会在子类中,查找func函数,找到了两个func,一个是2个参数的,一个是3个参数的. //3 C++编译器开始报错..... error C2661: “Child::func”: 没有重载函数接受 4 个参数 //4 若想调用父类的func,只能加上父类的域名..这样去调用.. c1.func(1, 3, 4, 5); //c1.func(); //func函数的名字,在子类中发生了名称覆盖;子类的函数的名字,占用了父类的函数的名字的位置 //因为子类中已经有了func名字的重载形式。。。。 //编译器开始在子类中找func函数。。。。但是没有0个参数的func函数
3 重點:
C++中多態的實作原理
當類別中宣告虛函數時,編譯器會在類別中產生一個虛函數表
類別成員函數指標的資料結構
虛函數表是由編譯器自動產生與維護的
virtual成員函數會被編譯器放入虛擬函數表中
存在虛函數時,每個物件中都有一個指向虛擬函數表的指標(vptr指標)
說明1:
透過虛函數表所調用操作才能確定真正應該呼叫的函數。而普通成員函數是在編譯時就決定了呼叫的函數。在效率上,虛函數的效率要低很多。
說明2:
出於效率考慮,沒有必要將所有成員函數都宣告為虛擬函數
說明3 :C++編譯器,執行HowToPrint函數,不需要區分是子類別物件還是父類別物件
以上就是C++複習要點總結之十-多型(一)的內容,更多相關內容請關注PHP中文網(www.php.cn)!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

策略模式在C++中的實作步驟如下:定義策略接口,聲明需要執行的方法。建立具體策略類,分別實作該介面並提供不同的演算法。使用上下文類別持有具體策略類別的引用,並透過它執行操作。

巢狀異常處理在C++中透過嵌套的try-catch塊實現,允許在異常處理程序中引發新異常。嵌套的try-catch步驟如下:1.外部try-catch區塊處理所有異常,包括內部異常處理程序拋出的異常。 2.內部try-catch區塊處理特定類型的異常,如果發生超出範圍的異常,則將控制權交給外部異常處理程序。

C++模板繼承允許模板衍生類別重複使用基底類別模板的程式碼和功能,適用於建立具有相同核心邏輯但不同特定行為的類別。模板繼承語法為:templateclassDerived:publicBase{}。實例:templateclassBase{};templateclassDerived:publicBase{};。實戰案例:建立了衍生類別Derived,繼承了基底類別Base的計數功能,並增加了printCount方法來列印目前計數。

在Docker環境中使用PECL安裝擴展時報錯的原因及解決方法在使用Docker環境時,我們常常會遇到一些令人頭疼的問�...

在 C 語言中,char 類型在字符串中用於:1. 存儲單個字符;2. 使用數組表示字符串並以 null 終止符結束;3. 通過字符串操作函數進行操作;4. 從鍵盤讀取或輸出字符串。

在多執行緒C++中,例外處理透過std::promise和std::future機制實作:在拋出例外的執行緒中使用promise物件記錄例外。在接收異常的執行緒中使用future物件檢查異常。實戰案例顯示如何使用promise和future在不同執行緒中捕捉和處理異常。

語言多線程可以大大提升程序效率,C 語言中多線程的實現方式主要有四種:創建獨立進程:創建多個獨立運行的進程,每個進程擁有自己的內存空間。偽多線程:在一個進程中創建多個執行流,這些執行流共享同一內存空間,並交替執行。多線程庫:使用pthreads等多線程庫創建和管理線程,提供了豐富的線程操作函數。協程:一種輕量級的多線程實現,將任務劃分成小的子任務,輪流執行。

C35 的計算本質上是組合數學,代表從 5 個元素中選擇 3 個的組合數,其計算公式為 C53 = 5! / (3! * 2!),可通過循環避免直接計算階乘以提高效率和避免溢出。另外,理解組合的本質和掌握高效的計算方法對於解決概率統計、密碼學、算法設計等領域的許多問題至關重要。
