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個介面,多種方法 在程式執行的過程中才決定呼叫的機制 程式實現上是這樣 通過父類指標呼叫子類的函式,...