物件導向程式設計系列二 虛函式基本概念

2022-09-14 06:51:08 字數 1491 閱讀 1280

如果基類希望派生類對它的某些成員函式進行重定義,那麼該基類需要將成員函式宣告為virtual函式,即虛函式,而不希望被重定義的函式則為普通的非虛函式。

呼叫虛函式時編譯器需要動態繫結以確定究竟要呼叫的是哪乙個類的函式,而觸發動態繫結的不僅要求呼叫的函式是虛函式,還要求必須通過基類型別的引用或指標進行函式呼叫。

(1)派生類物件可以當做基類物件使用

因為每個派生類物件都包含基類部分,所以可以將基類型別的引用繫結到派生類物件的基類部分,也可以用指向基類的指標指向派生類物件。例如:

double print(const item_base&);

item_base item;

print(item);

item_base* p = &item;

bulk_item bulk;

print(bulk);

//在需要使用基類物件的地方使用了派生類物件 這是合法的

p = &bulk;//

基類指標指向派生類物件

如上所示,可以將基類型別的指標或引用來指向或引用派生類物件,所以,當使用基類型別的指標或引用時,無法確定所使用的物件是基類物件還是派生類物件,但是編譯器都會將它當做基類型別物件,這是安全的,因為派生類物件是含有基類子物件的,任何可以在基類物件上執行的操作都可以通過派生類物件使用。

這裡有兩個概念:靜態型別和動態型別,靜態型別是指編譯時期就能確定的指標型別或引用型別,動態型別是指執行時才能確定的指向或引用的物件的型別。

(2)非虛函式的靜態繫結

在這裡假設使用的靜態型別是基類指標或引用,那麼呼叫的非函式則不管所指向的物件的型別也即動態型別是什麼,都是基類中定義的,它是在編譯時就已確定了的,即使派生類中對非虛函式進行了重定義,只要靜態型別是基類型別,那麼呼叫的都是基類中的成員。

(3)虛函式的動態繫結

虛函式的動態繫結是實現多型的關鍵,它是指當通過基類指標或引用呼叫乙個虛函式時,這個虛函式是在執行時確定的,由動態型別確定。

如果希望呼叫的虛函式不是動態型別的而是指定的某一型別,那麼可以使用域操作符覆蓋虛函式機制:

item_base* basep = &derived;

basep->item_base::func();//

呼叫的是靜態型別基類物件的成員函式

注意:虛函式也可以有預設實參,但預設實參的值由靜態型別確定,與動態型別無關。

(4)純虛函式和抽象類

在有些情況下,基類中不能給出虛函式有意義的實現,只能把虛函式的實現留給派生類去實現,例如動物作為乙個基類可以派生出老虎、孔雀等類,但是動物本身生成物件卻不合理,此時將基類中的函式定義為純虛函式,含有純虛函式的基類就成為了抽象類,抽象類是不能建立物件的,它是對多種具有相似性的具體事物的共同特徵的一種抽象,主要用來統一管理子物件。純虛函式的定義方式為:

virtual 函式返回值型別 虛函式名(形參表) = 0;

物件導向程式設計複習(一) 繼承 虛函式

題目描述 普通會員類member,包含編號 姓名 積分三個屬性,編號和積分是整數,姓名是字串 操作包括構造 列印 積分累加 積分兌換,操作定義如下 1 積分累加add,是根據消費金額累加積分,無返回值,引數是消費金額 整數 積分根據消費金額按1比1的比例累加 2 積分兌換exchange,是按照每1...

物件導向 多型(虛函式)

虛函式 用關鍵字virtual修飾的 類的成員函式 虛函式定義 語法形式 class x虛函式的意義 即虛函式的虛特徵 基類指標 或引用 指向 派生類的物件時,通過該指標 或引用 訪問派生類中的虛函式時,將呼叫該指標 或引用 實際所指物件的成員函式!指標和引用給基類的是派生類的位址 例子 class...

物件導向程式設計 虛函式表和虛基類表

一 虛函式表 每個含有虛函式的類有一張虛函式表 vtbl 表中每一項是乙個虛函式的位址,也就是說,虛函式表的每一項是乙個虛函式的指標。沒有虛函式的c 類,是不會有虛函式表的 如果派生類是多重繼承,則有多少個有虛函式的基類,就對應有多少個虛函式表。這說明沒有另外生成乙個派生類自己的虛函式表指標。那派生...