C++多態(虛函數,純虛函數,抽象類)

一.多態

1.理解:

多種形態,多種形式

eg:多個派生類均把基類的方法run重新實現,但是實現的方式不同,體現了多種形式,即為多態

2.分類

(1)編譯時的多態:在編譯過程中確定了同名操作的具體操作對象;

(2)運行時的多態:程序運行過程中才動態地確定操作所針對的對象;

3.聯編

是確定操作的具體對象的過程——把一個標識符名和存儲地址聯系在一起的過程;

聯編:把一條消息和一個對象的方法結合的過程;

根據進行的截斷的不同,可以分為:靜態聯編和動態聯編;

靜態聯編——編譯時多態性——函數重載和運算符重載

動態鏈表——運行時多態性——虛函數

二.函數重載

函數的重載也稱多態函數:使得程序能用同一個名字來訪問一組相關的函數,提高程序的靈活性

函數名相同,但是函數所帶的參數的個數或者數據類型不同;——編譯器根據參數決定調用哪個

1.形式:(1)參數個數或類型有所差別;(2)參數完全相同但屬于不同的類

主要談參數完全相同,但是屬于不同的類;

方法:用對象名區別或者用類名和范圍解析運算符區別

eg:Point pob(15,15)

pob.area()? ? ? ? ?Point::area()

三.虛函數

虛函數實現的是動態的重載;函數調用與函數體之間的聯系是在運行時建立的;動態聯編

1.定義虛函數

在基類中進行,把基類中需要定義為虛函數的成員函數聲明為virtual

基類中的某個成員函數被聲明為虛函數后,就可以在派生類中重新定義。在派生類中重新定義時,其函數原型包括返回類型,函數名,參數個數和類型,參數的順序都必須與基類中的原型完全一致

(指向派生類對象的指針,不能指向私有派生類的對象;當指向公有派生類的對象是只能直接訪問派生類中從基類繼承下來的成員不能直接訪問公有派生類中定義的成員;)

注意事項:

(1)虛函數的聲明只能出現在類函數原型的聲明中,不能出現在函數實體實現時;

(2)基類中只有保護成員或公有成員才能被聲明為虛函數;

(3)在派生類中重新定義虛函數時,關鍵字virtual可寫可不寫

(4)動態聯編只能通過成員函數來調用或通過指針,引用來訪問虛函數

四。多級繼承和虛函數

多級繼承的虛函數與單繼承的虛函數的調用相同。不同類創建的對象調用的函數是不一樣的;

class Base
{
public:virtual void func(){cout << "Base output" << endl;}
};class Derived1 :public Base
{
public:void func(){cout << "Derived output!" << endl;}
};class Derived2 :public Derived1
{
public:void func(){cout << "Derived2 output!" << endl;}
};void test(Base& b)
{b.func();
}int main()
{Base bObj;Derived1 d1Obj;Derived2 d20bj;//當把基類中的virtual去掉之后,再次運行程序,此時的結果為:只是Base outputtest(bObj);test(d1Obj);test(d20bj);}

五.純虛函數和抽象類

抽象類:包含純虛函數的特殊的類;

建立抽象類是為了多態的使用抽象類的成員函數;

1.純虛函數

在當前的基類中不能為虛函數給出一個有意義的實現時,可將其聲明為純虛函數;純虛函數的實現留給派生類來完成,純虛函數的作用是為派生類提供一個一致的接口;

一般來說:一個抽象類至少有一個純虛函數;

純虛函數的定義:

virtual<函數類型><函數名>(參數表)=0;

virtual void set()=0;//在這里并不表示返回值為0,只是起到形式上的作用,告訴編譯器它是純虛函數,說明在基類中不用定義該函數的函數體;

2.抽象類

包含純虛函數的一種特殊的類,是為了抽象和設計而建立的;并且抽象類是不能創建對象的,?為了強調一個類是抽象類,可以將該類的構造函數聲明為保護的訪問控制權限;

只做子類的共同的操作接口;

抽象類只能用做其他類的基類,不能創建抽象類的對象;不能用作參數類型,函數的返回類型或顯式轉換的類型;

struct IDraw
{virtual void draw() = 0;
};struct ISize
{virtual void getSize(int& w, int& h) = 0;
};class Shape :public ISize, public IDraw
{};class Circle :public Shape
{
private:int m_x, m_y, m_r;
public:Circle(int x, int y, int r);void draw();void getSize(int& w, int& h);
};Circle::Circle(int x, int y, int r) :m_x(x), m_y(y), m_r(r)
{;
}
void Circle::draw()
{cout << "Draw a circle" << endl;
}void Circle::getSize(int& w, int& h)
{w = 2 * m_r;h = 2 * m_r;
}int main()
{Circle circle(0, 0, 123);IDraw* pDraw = &circle;pDraw->draw();ISize* pSize = &circle;int w = 0, h = 0;pSize->getSize(w, h);cout << "Width:" <<w<< endl;cout << "Height:" << h << endl;return 0;
}

通過上述例子:我們可以聲明抽象類的對象指針或者引用,上述:IDraw*pDraw;就可以通過這個指針或者引用來訪問派生類的對象成員

(在這里說明:C++中,結構體和類幾乎是相同的,主要區別在默認的訪問權限,類默認為私有的,而結構體默認為公有的,除了上述區別之外,;類可以繼承自結構體,結構體也可以繼承自類或者其他結構體,并且結構體中,我們經常定義接口(一組相關的純虛函數),類可以從這些接口結構體繼承,以實現這些接口,就比如上述:IDraw中的draw就為純虛函數)


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

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

相關文章

Java中的代碼優化與重構策略

Java中的代碼優化與重構策略 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 1. 引言 代碼優化與重構在軟件開發中扮演著至關重要的角色。優秀的代碼不僅令人…

將游戲降權運行 2024年,防止游戲檢測,泄漏個人隱私

不得不說&#xff0c;現在的游戲&#xff0c;膽子是真的越來越大了。很多都帶了個啟動器&#xff0c;你開著游戲的時候他就給他開多了1個掃描器&#xff0c;看下你有沒看一些小孩不宜的&#xff0c;玩游戲不宜打開的軟件什么的&#xff0c;包括你的MAC地址啊&#xff0c;你當前…

pydub、ffmpeg 音頻文件聲道選擇轉換、采樣率更改

快速查看音頻通道數和每個通道能力判斷具體哪個通道說話&#xff1b;一般能量大的那個算是說話 import wave from pydub import AudioSegment import numpy as npdef read_wav_file(file_path):with wave.open(file_path, rb) as wav_file:params wav_file.getparams()num_cha…

量化交易:金融投資的新篇章

在金融投資的世界里&#xff0c;量化交易正逐漸成為一股不可忽視的力量。它以數據驅動和算法決策為特點&#xff0c;為投資者提供了一種全新的交易方式。本文將深入探討量化交易的基本概念、優勢、挑戰以及如何開始使用量化交易策略。 量化交易的定義與起源 量化交易&#xf…

Android10以上實現獲取設備序列號功能

Android10以上實現獲取設備唯一標識&#xff0c;目前只支持華為和榮耀設備。實現原理&#xff1a;通過無障礙服務讀取序列號界面。 public class DeviceHelper implements Application.ActivityLifecycleCallbacks {static final String TAG "WADQ_DeviceHelper";s…

Zoom使用的基本步驟和注意事項

Zoom是一款功能強大的視頻會議軟件&#xff0c;廣泛應用于遠程辦公、在線教育、團隊協作等多個場景。以下是Zoom使用的基本步驟和注意事項&#xff1a; 一、注冊與登錄 注冊Zoom賬戶&#xff1a; 訪問Zoom官方網站&#xff08;如zoom.us&#xff09;&#xff0c;點擊“注冊”…

Android Enable 和clickable

setEnabled 使能控件 設置為false&#xff0c;該控件永遠不會活動&#xff0c;不管設置為什么屬性&#xff0c;都無效&#xff1b; 設置為true&#xff0c;表明激活該控件&#xff0c;控件處于活動狀態&#xff0c;處于活動狀態&#xff0c;就能響應事件了&#xff0c;比如觸摸…

mybatis實現動態sql

第一章、動態SQL MyBatis 的強大特性之一便是它的動態 SQL。如果你有使用 JDBC 或其它類似框架的經驗&#xff0c;你就能體會到根據不同條件拼接 SQL 語句的痛苦。例如拼接時要確保不能忘記添加必要的空格&#xff0c;還要注意去掉列表最后一個列名的逗號。利用動態 SQL 這一特…

2024北京大健康展,北京健康生活產品展覽會十月舉辦

2024北京健博會&#xff0c;立足北京&#xff0c;效應輻射全國買方市場&#xff0c;助力健康中國事業建設&#xff1b; 2024第11屆中國&#xff08;北京&#xff09;國際大健康產業博覽會 The 2024 China (Beijing) International Health Service Expo 時間&#xff1a;2024年…

華為 RIP 協議中 RIP 兼容版本、RIPv1、RIPv2 在收發 RIP 報文時的區別

華為 RIP 協議中 RIP 兼容版本、RIPv1、RIPv2 的區別 為了更好地支持實際環境中路由器對 RIP 的支持&#xff0c;華為 VRP 平臺具有一個兼容版本&#xff0c;默認情況下啟動 RIP 進程后&#xff0c;如果沒有配置 RIP 版本&#xff0c;該版本就為兼容版本&#xff0c;對 versio…

[ C++ ] 深入理解模板( 進 階 )

目錄 非類型模板參數 類模板沒有實例化的情況 模板的特化 注意函數特化中遇到的問題 建議&#xff1a;&#xff08;直接使用函數重載&#xff09; 類模板特化 全特化 偏特化 偏特化有以下兩種表現方式&#xff1a; 部分特化&#xff08;將模板參數類表中的一部分參數特化…

vue this.$refs加變量名

想動態獲取$refs&#xff0c;我們可以用模板字符串來動態綁定ref的值。代碼如下&#xff1a; this.$refs[${this.treeQueFlag}].setCheckedNodes([]); $refs后面拼變量&#xff0c;vue動態給$refs賦值_vue ref動態賦值-CSDN博客

旅游系統(附管理端+前臺)PHP源碼

一. 前言 今天小編給大家帶來了一款可學習&#xff0c;可商用的&#xff0c;旅游系統 源碼&#xff0c;支持二開&#xff0c;無加密。支持景點管理&#xff0c;登錄&#xff0c;景點預定&#xff0c;意見反饋&#xff0c;統計等功能。詳細界面和功能見下面視頻演示。 二. 視頻…

【flutter問題記錄】 無效的源發行版:17

問題描述 在看開源項目的時候&#xff0c;clone下來后一直編譯失敗&#xff0c;提示&#xff1a;無效的源發行版:17&#xff0c;看描述大概是jdk的版本問題&#xff0c;但是在Android studio各種指定都無用&#xff0c;網上資料也沒有flutter項目的解決方案&#xff0c;最后在…

在Spring MVC框架中,如何處理HTTP請求和響應?

在Spring MVC框架中&#xff0c;HTTP請求和響應的處理是通過一系列組件和流程來完成的。以下是Spring MVC處理HTTP請求和響應的主要步驟&#xff1a; 用戶發起請求&#xff1a; 用戶在客戶端&#xff08;如瀏覽器&#xff09;上發起一個HTTP請求&#xff0c;這個請求被發送到服…

廣州自閉癥機構哪家好?

在廣州&#xff0c;眾多的自閉癥康復機構中&#xff0c;星貝育園自閉癥兒童康復學校以其獨特的優勢脫穎而出。 一、專業的師資團隊 我們擁有一支經驗豐富、專業素養極高的師資隊伍。每位老師都經過嚴格的專業培訓&#xff0c;深入了解自閉癥兒童的特點和需求。他們不僅具…

深入挖掘海外快手kwai ads推廣巴西slots手游廣告獨家優勢

深入挖掘海外快手kwai ads推廣巴西slots手游廣告獨家優勢 在數字化時代&#xff0c;廣告投放已成為各行各業不可或缺的一部分&#xff0c;特別是在游戲行業&#xff0c;如何有效地推廣游戲產品&#xff0c;吸引玩家的眼球&#xff0c;成為了每一個游戲開發商和廣告主所關注的焦…

假設性文檔嵌入 HyDE:大模型 + 對比學習,從關鍵詞相似度搜索到語義搜索

假設性文檔嵌入 HyDE&#xff1a;大模型 對比學習&#xff0c;從關鍵詞相似度搜索到語義搜索 提出背景流程圖解法拆解類比1. 單一文檔嵌入空間的搜索2. 指令跟隨型語言模型&#xff08;InstructLM&#xff09;的引入3. 生成文檔的嵌入編碼 提出背景 論文&#xff1a;https://…

python怎么樣將一段程序無效掉

1、python中可以用注釋屏蔽一段語句&#xff0c;具體方法如下&#xff0c;首先打開一段python的示例程序&#xff1a; 2、然后單行注釋的方法是在語句前面加上#&#xff0c;程序運行后添加注釋的地方的語句會被自動跳過&#xff0c;這里可以看到將打印變量a的語句添加注釋就沒有…