翻譯 C 多型機制

2021-06-25 22:38:38 字數 3858 閱讀 4445

www.cplusplus.com使用google搜尋c++polymorphic顯示的第乙個網頁便是該網頁.

c++ 多型機制

在更深入的了解本章節前,你需要對於指標與類的繼承有初步的理解.如果你不是很確定是否理解以下的表示式,你需要複習下列的章節

statement:

explained in:

int a::b(int c)

classes

a->b

data structures

class a: public b {};

友元與繼承

指向基類的指標

關於類的繼承,有乙個特性特別的關鍵,那就是繼承類允許具有可相容其基類物件的指標,多型正是基於這一簡單但是有效並且多用特性的藝術.

以下例子,真是基於以上特性,利用指標來完成可複寫的三角與矩形類.

/ /pointers to base class

#include using namespace std;

class polygon };

class rectangle: public polygon };

class ********: public polygon };

int main ()

返回結果

函式main中,宣告兩個指向polygon的指標(命名為ppoly1 和 ppoly2),他們被分別用於指向 繼承同一基類的rectangle類tect與traiang類trgl.因此以下兩個表示式都是等價的

ppoly1->set_values (4,5);

rect.set_values (4,5);

然而因為ppoly1與ppoly2是指向polyon,而非指向rectangle與********.因此只有繼承自polygon類的成員允許被訪問.而來自retangle與traingle不許被訪問.這就是為什麼我在這裡使用類rect與trgl而不是指標(ppoly1與ppoly2)來訪問area函式,指向基類的指標是無法訪問成員函式area的.

只有當area是基類polygon的成員,而非其繼承類的成員時,使用指向基類的指標允許訪問area成員.但是問題在於retangle與********具有兩個不同版本的area函式,因此不具有乙個單一的通用的版本能夠在基類中被運用.

虛函式

虛函式是能夠在繼承類中被重定義的成員函式,因此其可以保護通過引用來訪問(類的)特性(的行為).虛函式使用關鍵字virtual來定義.

// virtual members

#include using namespace std;

class polygon

virtual int area ()

}; class rectangle: public polygon };

class ********: public polygon };

int main ()

在上述的例子中,使用了三個類(polygon,rectangle,********)具有相同的成員:width,heigh與相同的函式set_value area.

成員函式area在繼承類中被宣告成虛函式.非虛函式也在繼承類中被宣告,然而這些非虛函式,無法通過基類的引用被呼叫,比如,如果area函式關鍵字virtual被移除,那麼在上述的例子中,三個對area的訪問將返回0,因為在上述的例子中,基類的函式版本將會在本次的訪問中被呼叫.

因此,本質上,關鍵字virtual被用於使用以允許指標訪問成員函式,該繼承類函式與與基類同名.更精確的說在上述例子中,上述型別的指標式指向繼承類的基類指標.

乙個類能共被宣告或者繼承乙個虛函式是被稱作是多型類.

儘管具有乙個虛函式,polygon依舊是乙個允許被例項化的普通類(poly),本身的成員函式area依舊可以返回0.

抽象基類

抽象基類與此前的polygon基類類似,其是只被允許被當做基類來使用.因此其允許擁有不需要定義的函式(純虛函式).

以下為乙個具體的純虛類polygon

class polygon 

virtual int area () =0;

};

注意在這裡area,沒有被定義,相反被=0替代,這使得該函式被定義為純虛函式.包含純虛函式的類被稱作是抽象基類.

polygon mypolygon;   // 

由於polygon是抽象基類因此這裡無法工作

但是抽象基類並非是無用的.它能共用於定義指向抽象基類的指標,其能共使用基類的多型屬性.
2

polygon * ppoly1;

polygon * ppoly2;

該類指向繼承類的指標是可以被解引用的.

class polygon 

virtual int area () =0;

};

在上述的例子中,兩個不同卻又相關的型別使用相同的指標(polygon*),同時每一次(對函式)訪問都是適當的.因為該函式是虛函式.他們在一些的環境下都是可用的,下面是乙個例子,

某個抽象基類polygon的成員函式可以被指標this訪問虛函式,及時polygon沒有被例項化.

// pure virtual members can be called

// from the abstract base class

#include using namespace std;

class polygon

virtual int area() =0;

void printarea()

}; class rectangle: public polygon };

class ********: public polygon };

int main ()

虛函式與抽象基類在c++的多型特性中具有重大的價值,幾乎可以說是最有價值的下面的.當然上述的例子非常簡單,但是上述的特性在類陣列或者是動態分配陣列中依舊適用.

下述的例子包含前幾章節的某些特性,包括動態記憶體,構造器,多型

// dynamic allocation and polymorphism

#include using namespace std;

class polygon

virtual int area (void) =0;

void printarea()

}; class rectangle: public polygon

int area()

}; class ********: public polygon

int area()

}; int main ()

上面的ppoly指標:

olygon * ppoly1 = new rectangle (4,5);

polygon * ppoly2 = new ******** (4,5);

是被宣告成polygon型別,但是依舊動態構造成指向繼承類的指標

C 多型機制

一 多型的基本概念 多型 polymorphism 就是多種狀態,在c 中只 乙個介面,多個實現方法 二 多型的兩種方式 c 支援兩種多型性 編譯時多型性,執行時多型性。a.編譯時多型,通過函式過載實現,靜態繫結 b.執行時多型,通過虛函式實現,動態繫結 三 虛函式 virtual a.非虛函式,呼...

C 多型實現的機制

1 多型的概念 從使用方式上簡單的說 就是將父型別的指標指向其子類的例項,然後通過父類指標呼叫子類的成員函式。這種技術可以讓父類的指標有 多種形態 這是一種泛型技術。所謂泛型技術,說白了就是試圖使用不變的 來實現可變的演算法。比如 模板技術,rtti技術,虛函式技術,要麼是試圖做到在編譯時決議,要麼...

C 多型實現機制剖析

物件導向的三大概念 封裝,繼承,多型。封裝突破了c語言函式的概念 繼承實現了 的復用,那麼多型實現了什麼價值呢,簡單理解就是前人寫的 框架 可以呼叫後人寫的 1 什麼是多型?多型性可以簡單的概括為 1個介面,多種方法 在程式執行的過程中才決定呼叫的機制 程式實現上是這樣 通過父類指標呼叫子類的函式,...