當前位置:首頁 » 編程軟體 » 編譯時多態使用什麼方式實現的

編譯時多態使用什麼方式實現的

發布時間: 2022-12-06 09:45:45

Ⅰ 多態的表現形式是什麼

多態指同一個實體同時具有多種形式。它是面向對象程序設計(OOP)的一個重要特徵。如果一個語言只支持類而不支持多態,只能說明它是基於對象的,而不是面向對象的。C++中的多態性具體體現在運行和編譯兩個方面。

運行時多態是動態多態,其具體引用的對象在運行時才能確定。編譯時多態是靜態多態,在編譯時就可以確定對象使用的形式。

多態:同一操作作用於不同的對象,可以有不同的解釋,產生不同的執行結果。在運行時,可以通過指向基類的指針,來調用實現派生類中的方法。

C++中,實現多態有以下方法:虛函數,抽象類,覆蓋,模板(重載和多態無關)。

OC中的多態:不同對象對同一消息的不同響應.子類可以重寫父類的方法

多態就是允許方法重名 參數或返回值可以是父類型傳入或返回。

多態也指生物學中腔腸動物的特殊的生活方式。水螅態與水母態的世代交替現象。

(1)編譯時多態使用什麼方式實現的擴展閱讀:

多態作用:

把不同的子類對象都當作父類來看,可以屏蔽不同子類對象之間的差異,寫出通用的代碼,做出通用的編程,以適應需求的不斷變化。

賦值之後,父類型的引用就可以根據當前賦值給它的子對象的特性以不同的方式運作。也就是說,父親的行為像兒子,而不是兒子的行為像父親。

舉個例子:從一個基類中派生,響應一個虛命令,產生不同的結果。

比如從某個基類派生出多個子類,其基類有一個虛方法Tdoit,然後其子類也有這個方法,但行為不同,然後這些子類對象中的任何一個可以賦給其基類對象的引用。

或者說將子對象地址賦給基類指針,這樣其基類的對象就可以執行不同的操作了。實際上你是在通過其基類的引用來訪問其子類對象的,你要做的就是一個賦值操作。

使用繼承性的結果就是當創建了一個類的家族,在認識這個類的家族時,就是把子類的對象當作基類的對象,這種認識又叫作upcasting(向上轉型)。

這樣認識的重要性在於:我們可以只針對基類寫出一段程序,但它可以適應於這個類的家族,因為編譯器會自動找出合適的對象來執行操作。這種現象又稱為多態性。而實現多態性的手段又叫稱動態綁定(dynamic binding)。

Ⅱ 什麼是多態啊

什麼是多態?

可以這么回答:

  • 父類引用
    引用子類對象

  • 父類和子類有同名的覆蓋方法

  • 通過父類引用調用這個重寫的方法的時候。多數的話就可以稱為多態,單數可以說運行時綁定。

使用多態有什麼好處?

  • 類調用者對類的使用成本進一步降低

  • 封裝是讓類的調用者不需要知道類的實現細節,多態能讓類的調用者連這個類的類型是什麼都不必知道,只需要知道這個對象具有某個方法即可。因此,多態可以理解成是封裝的更進一步,讓類調用者對類的使用成本進一步降低。

  • 能夠降低代碼的「圈復雜度」,避免使用大量的if-else

多態在代碼中的體現:

輸出結果:
貓吃魚
貓吃魚(因為描述的是真正的是一隻貓)

拓展:

多態性:同一操作作用於不同的對象,可以用不同的解釋,產生不同的執行結果,這就是多態性。

多態性通過派生類覆寫基類中的虛函數的方法來實現。

多態性分為兩種,一種是編譯時的多態性,一種是運行時的多態性。

編譯時的多態性:編譯時多態是通過重載來實現的。對於非虛的成員來說,系統在編譯時,根據傳遞的參數,返回的類型等信息決定實現何種操作。

運行時的多態性:運行時的多態性就是指直到系統運行時,才根據實際情況決定實現何種操作。

Ⅲ C++中多態是怎樣實現的

多態是一種不同的對象以單獨的方式作用於相同消息的能力,這個概念是從自然語言中引進的。例如,動詞「關閉」應用到不同的事務上其意思是不同的。關門,關閉銀行賬號或關閉一個程序的窗口都是不同的行為;其實際的意義取決於該動作所作用的對象。 大多數面向對象語言的多態特性都僅以虛擬函數的形式來實現,但C++除了一般的虛擬函數形式之外,還多了兩種靜態的(即編譯時的)多態機制: 2、模板:例如,當接受到相同的消息時,整型vector對象和串vector對象對消息反映是不同的,我們以關閉行為為例: vector < int > vi; vector < string > names; string name("VC知識庫"); vi.push_back( 5 ); // 在 vector 尾部添加整型 names.push_back (name); // 添加串和添加整型體現差別的潛在的操作 靜態的多態機制不會導致與虛擬函數相關的運行時開。此外,操作符重載和模板兩者是通用演算法最基本的東西,在STL中體現得尤為突出。 那麼接下來我們說說以虛函數形式多態: 通常都有以重載、覆蓋、隱藏來三中方式,三種方式的區別大家應該要很深入的了解,這里就不多說了。 許多開發人員往往將這種情況和C++的多態性搞混淆,下面我從兩方面為大家解說: 1、 編譯的角度 C++編譯器在編譯的時候,要確定每個對象調用的函數的地址,這稱為早期綁定(early binding)。2、 內存模型的角度為了確定對象調用的函數的地址,就要使用遲綁定(late binding)技術。當編譯器使用遲綁定時,就會在運行時再去確定對象的類型以及正確的調用函數。而要讓編譯器採用遲綁定,就要在基類中聲明函數時使用virtual關鍵字(注意,這是必須的,很多開發人員就是因為沒有使用虛函數而寫出很多錯誤的例子),這樣的函數我們稱為虛函數。一旦某個函數在基類中聲明為virtual,那麼在所有的派生類中該函數都是virtual,而不需要再顯式地聲明為virtual。 那麼如何定位虛表呢?編譯器另外還為每個類的對象提供了一個虛表指針(即vptr),這個指針指向了對象所屬類的虛表。在程序運行時,根據對象的類型去初始化vptr,從而讓vptr正確的指向所屬類的虛表,從而在調用虛函數時,就能夠找到正確的函數。 正是由於每個對象調用的虛函數都是通過虛表指針來索引的,也就決定了虛表指針的正確初始化是非常重要的。換句話說,在虛表指針沒有正確初始化之前,我們不能夠去調用虛函數。那麼虛表指針在什麼時候,或者說在什麼地方初始化呢? 答案是在構造函數中進行虛表的創建和虛表指針的初始化。還記得構造函數的調用順序嗎,在構造子類對象時,要先調用父類的構造函數,此時編譯器只「看到了」父類,並不知道後面是否後還有繼承者,它初始化父類對象的虛表指針,該虛表指針指向父類的虛表。當執行子類的構造函數時,子類對象的虛表指針被初始化,指向自身的虛表。 要注意:對於虛函數調用來說,每一個對象內部都有一個虛表指針,該虛表指針被初始化為本類的虛表。所以在程序中,不管你的對象類型如何轉換,但該對象內部的虛表指針是固定的,所以呢,才能實現動態的對象函數調用,這就是C++多態性實現的原理。總結(基類有虛函數):1、 每一個類都有虛表。2、虛表可以繼承,如果子類沒有重寫虛函數,那麼子類虛表中仍然會有該函數的地址,只不過這個地址指向的是基類的虛函數實現。如果基類3個虛函數,那麼基類的虛表中就有三項(虛函數地址),派生類也會有虛表,至少有三項,如果重寫了相應的虛函數,那麼虛表中的地址就會改變,指向自身的虛函數實現。如果派生類有自己的虛函數,那麼虛表中就會添加該項。3、派生類的虛表中虛函數地址的排列順序和基類的虛表中虛函數地址排列順序相同。

Ⅳ 編譯時多態性使用什麼獲得!A重載函數B繼承C虛函數D.B和C

函數重載和模板。就這題來說選A。
繼承和虛函數對應的多態需要在運行的時候才能確定具體對象,所以不屬於編譯時多態。

函數重載是讓一個函數名對應多個函數,編譯器會根據調用時候的特徵確定要調用的函數,不需要再運行時處理。
而模板是讓一個一個類型模板或者函數模板對應多個類型或者函數,編譯器根據對模板實例化是使用的參數生成具體的類和函數,也不是在運行時進行的。
另外注意模板變數不屬於多態范疇。

Ⅳ c++多態的實現方式有哪些

c++是一種編程語言,當然只有一種。但是基於c++的編程平台有很多種。

在這些平台上編程序,用的語言是c++的,但是在一些細節上會有所不同。我接觸過的主要有vc++,symbian c++,borland c++,它們都是基於c++的,但是編程風格或方式稍有不同。

你學c++要打好基礎,先學好c++語言。看書的時候可以找一些書名為「c++編程語言」之類的書,只有在學好c++語言後,才可以去具體的學習某個平台的編程教程。

一般來說,多態分為兩種,靜態多態和動態多態。靜態多態也稱編譯時多態,主要包括模板和重載。而動態多態則是通過類的繼承和虛函數來實現,當基類和子類擁有同名同參同返回的方法,且該方法聲明為虛方法。

當基類對象,指針,引用指向的是派生類的對象的時候,基類對象,指針,引用在調用基類的虛函數,實際上調用的是派生類函數。這就是動態多態。

靜態多態的實現。

靜態多態靠編譯器來實現,簡單來說就是編譯器對原來的函數名進行修飾,在c語言中,函數無法重載,是因為,c編譯器在修飾函數時,只是簡單的在函數名前加上下劃線」_」 ,不過從gcc編譯器編譯之後發現函數名並不會發生變化。

而c++編譯器不同,它根據函數參數的類型,個數來對函數名進行修飾,這就使得函數可以重載,同理,模板也是可以實現的,針對不同類型的實參來產生對應的特化的函數,通過增加修飾,使得不同的類型參數的函數得以區分。

Ⅵ C++編程中多態性的實現機制到底是什麼呀

樓上的說不對
在C++中,多態性分為兩種,一種稱為編譯時多態,另一種為運行時多態
分別解釋下:
1.編譯時多態,也就是函數重載,所謂函數重載是指同一個函數名可以對應著多個函數的實現,具體調用哪個按照由參數個數,參數類型等來決定,這個簡單,就不說了
2.運行時多態,就是虛函數。
在定義了虛函數後,可以在基類的派生類中對虛函數重新定義,以實現你所想要的功能。

java的多態怎麼實現

實現多態的三個條件(前提條件,向上轉型、向下轉型)
1、繼承的存在;(繼承是多態的基礎,沒有繼承就沒有多態)
2、子類重寫父類的方法。(多態下會調用子類重寫後的方法)
3、父類引用變數指向子類對象。(涉及子類到父類的類型轉換)
向上轉型 Student person = new Student()
將一個父類的引用指向一個子類對象,成為向上轉型,自動進行類型轉換。此時通過父類引用變數調用的方法是子類覆蓋或繼承父類的方法,而不是父類的方法此時通過父類引用變數無法調用子類特有的方法。
向下轉型 Student stu = (Student)person;
將一個指向子類對象的引用賦給一個子類的引用,成為向下轉型,此時必須進行強制類型轉換。向下轉型必須轉換為父類引用指向的真實子類類型,,否則將出現ClassCastException,不是任意的強制轉換
向下轉型時可以結合使用instanceof運算符進行強制類型轉換,比如出現轉換異常---ClassCastException

Ⅷ java實現多態有幾種方式分別是什麼

首先,多態存在的三個必要條件
一、要有繼承;
二、要有重寫;
三、父類引用指向子類對象。
多態引用類型有兩種方式:
a. 編譯時多態:方法的重載;
b. 運行時多態:JAVA運行時系統根據調用該方法的實例的類型來決定選擇調用哪個方法則被稱為運行時多態。(我們平時說得多的事運行時多態,所以多態主要也是指運行時多態);

熱點內容
職場簡單編程 發布:2024-04-16 21:58:30 瀏覽:497
零食劇情腳本 發布:2024-04-16 20:59:56 瀏覽:82
我的世界粘土伺服器戰牆 發布:2024-04-16 20:55:31 瀏覽:683
sql字元串的長度 發布:2024-04-16 20:50:18 瀏覽:186
glc配置一般為什麼那麼貴 發布:2024-04-16 20:49:35 瀏覽:270
如何開啟共享電腦伺服器 發布:2024-04-16 20:21:06 瀏覽:660
銳捷升級伺服器地址 發布:2024-04-16 20:11:46 瀏覽:251
淘寶登錄密碼忘記如何改密碼 發布:2024-04-16 20:11:36 瀏覽:792
塞班和安卓哪個好一點 發布:2024-04-16 20:08:05 瀏覽:207
python安裝環境變數 發布:2024-04-16 20:06:47 瀏覽:780