虛函式和多型的總結

2021-08-21 03:52:33 字數 2479 閱讀 4733

在c++中,多型有兩種,一種是函式過載,一種是虛函式。函式過載發生在編譯的時候,它的函式引數是不一樣的。而虛函式是發生在執行的時候,它的函式原型是一樣的,依靠的是指標的指向。

結果似乎和我們想象的不一樣,既然graph類(圖形類)的物件graph指標分別指向了rectangle類(矩形類)物件,********類(三角類)物件,以及circle類(圓類)物件,那麼就應該執行它們自己所對應成員函式showarea(),怎麼結果會是graph類(圖形類)的物件graph裡的成員函式呢?這好像和我們在c++之繼承與派生(2)一節裡所講到的派生類成員覆蓋了基類中使用相同名稱的成員(派生類物件呼叫同名成員函式是來自於自己類中成員函式,而非基類中上的)有所不同啊,其實當基類物件指標指向公有派生類的物件時,它只能訪問從基類繼承下來的成員,而不能訪問派生類中定義的成員。但是使用動態指標就是為了表達一種動態呼叫的性質即當前指標指向哪個物件,就呼叫那個物件對應類的成員函式。那要怎麼來解決的,這時虛函式就體現出了它的作用。其實我們只需要對上乙個示例**中所有的類裡出現的showarea()函式宣告之前加乙個關鍵字virtual:

向物件程式設計中的多型性是指向不同的物件傳送同乙個訊息,不同物件對應同一訊息產生不同行為。在程式中訊息就是呼叫函式,不同的行為就是指不同的實現方法,即執行不同的函式體。也可以這樣說就是實現了「乙個介面,多種方法」。

從實現的角度來講,多型可以分為兩類:編譯時的多型性和執行時的多型性。前者是通過靜態聯編來實現的,比如c++中通過函式的過載和運算子的過載。後者則是通過動態聯編來實現的,在c++中執行時的多型性主要是通過虛函式來實現的,也正是今天我們要講的主要內容。

1.不過在說虛函式之前,我想先介紹乙個有關於基類與派生類物件之間的複製相容關係的內容。它也是之後學習虛函式的基礎。我們有時候會把整型資料賦值給雙精度型別的變數。在賦值之前,先把整形資料轉換為雙精度的,在把它賦值給雙精度型別的變數。這種不同型別資料之間的自動轉換和賦值,稱為賦值相容。同樣的,在基類和派生類之間也存在著賦值相容關係,它是指需要基類物件的任何地方都可以使用公有派生類物件來代替。為什麼只有公有繼承的才可以呢,因為在公有繼承中派生類保留了基類中除了構造和析構之外的所有成員,基類的公有或保護成員的訪問許可權都按原樣保留下來,在派生類外可以呼叫基類的公有函式來訪問基類的私有成員。因此基類能實現的功能,派生類也可以。

那麼它們具體是如何體現的呢?(1)派生類物件直接向基類賦值,賦值效果,基類資料成員和派生類中資料成員的值相同;(2)派生類物件可以初始化基類物件引用;(3)派生類物件的位址可以賦給基類物件的指標;(4)函式形參是基類物件或基類物件的引用,在呼叫函式時,可以用派生類的物件作為實參;

在c++中,多型有兩種,一種是函式過載,一種是虛函式。函式過載發生在編譯的時候,它的函式引數是不一樣的。而虛函式是發生在執行的時候,它的函式原型是一樣的,依靠的是指標的指向。

結果似乎和我們想象的不一樣,既然graph類(圖形類)的物件graph指標分別指向了rectangle類(矩形類)物件,********類(三角類)物件,以及circle類(圓類)物件,那麼就應該執行它們自己所對應成員函式showarea(),怎麼結果會是graph類(圖形類)的物件graph裡的成員函式呢?這好像和我們在c++之繼承與派生(2)一節裡所講到的派生類成員覆蓋了基類中使用相同名稱的成員(派生類物件呼叫同名成員函式是來自於自己類中成員函式,而非基類中上的)有所不同啊,其實當基類物件指標指向公有派生類的物件時,它只能訪問從基類繼承下來的成員,而不能訪問派生類中定義的成員。但是使用動態指標就是為了表達一種動態呼叫的性質即當前指標指向哪個物件,就呼叫那個物件對應類的成員函式。那要怎麼來解決的,這時虛函式就體現出了它的作用。其實我們只需要對上乙個示例**中所有的類裡出現的showarea()函式宣告之前加乙個關鍵字virtual:

向物件程式設計中的多型性是指向不同的物件傳送同乙個訊息,不同物件對應同一訊息產生不同行為。在程式中訊息就是呼叫函式,不同的行為就是指不同的實現方法,即執行不同的函式體。也可以這樣說就是實現了「乙個介面,多種方法」。

從實現的角度來講,多型可以分為兩類:編譯時的多型性和執行時的多型性。前者是通過靜態聯編來實現的,比如c++中通過函式的過載和運算子的過載。後者則是通過動態聯編來實現的,在c++中執行時的多型性主要是通過虛函式來實現的,也正是今天我們要講的主要內容。

1.不過在說虛函式之前,我想先介紹乙個有關於基類與派生類物件之間的複製相容關係的內容。它也是之後學習虛函式的基礎。我們有時候會把整型資料賦值給雙精度型別的變數。在賦值之前,先把整形資料轉換為雙精度的,在把它賦值給雙精度型別的變數。這種不同型別資料之間的自動轉換和賦值,稱為賦值相容。同樣的,在基類和派生類之間也存在著賦值相容關係,它是指需要基類物件的任何地方都可以使用公有派生類物件來代替。為什麼只有公有繼承的才可以呢,因為在公有繼承中派生類保留了基類中除了構造和析構之外的所有成員,基類的公有或保護成員的訪問許可權都按原樣保留下來,在派生類外可以呼叫基類的公有函式來訪問基類的私有成員。因此基類能實現的功能,派生類也可以。

那麼它們具體是如何體現的呢?(1)派生類物件直接向基類賦值,賦值效果,基類資料成員和派生類中資料成員的值相同;(2)派生類物件可以初始化基類物件引用;(3)派生類物件的位址可以賦給基類物件的指標;(4)函式形參是基類物件或基類物件的引用,在呼叫函式時,可以用派生類的物件作為實參;

多型和虛函式

在c 中,多型是通過虛函式實現的。基類如果把乙個函式宣告為虛的 virtual 就表明繼承類可以覆蓋 override 這個函式 從而表現不同的行為,呈現出多型性 對於每乙個有虛函式的類,或者覆蓋了乙個或多個基類虛函式的繼承類,可認為有乙個與之關聯的虛函式表 v table v table 表中的每...

虛函式和多型

虛函式的概念 在類的成員函式前加virtual關鍵字,這個成員函式稱為虛函式。虛函式重寫 當在子類的定義了乙個與父類完全相同的虛函式時,則稱子類的這個函式重寫 也稱覆蓋 了父類的這個虛函式。include using namespace std class person public virtual...

虛函式和多型

pragma once 普通飛機 class plane include plane.h include using namespace std void plane fly void plane land pragma once include plane.h 直公升飛機 class jet pu...