原文地址:
http://hi.baidu.com/dingzhoufang/blog/item/1f93026d1de7c0fd431694c4.html
繼承性、封裝性和多態(tài)性是面向?qū)ο蟮娜齻€核心概念,下面就來看看在C++和Java中
是如何實現(xiàn)面向?qū)ο髾C制的:
一 繼承性
面向?qū)ο蠓椒ㄖ械睦^承機制使子類可以自動地?fù)碛懈割惖娜繉傩院筒僮鳎ǚ椒ǎ?/span>
(1)C++
派生類是C++中實現(xiàn)繼承性的語法概念。派生類的一般聲明語法為:
Class 派生類名 :繼承方式 基類名1,繼承方式 基類名2,…,繼承方式 基類名n
{
派生類成員聲明;
};
其中:繼承方式有public, protected, private三種,默認(rèn)值為private。類的繼承方式指定了派生類成員以及類外對象對于從基類繼承來的成員的訪問權(quán)限。
在C++中,一個派生類(子類)可以同時有多個直接基類(父類),即C++支持多繼承。
當(dāng)然一個派生類(子類)也可以只有一個直接基類(父類),稱此種情況為單繼承。在派生的過程中,派生出來的新類也同樣可以作為基類再繼續(xù)派生新的類。一個基類可以同時派生出多個派生類,即一個類可以同時作為多個派生類的基類。
(2)java
在java語言中,子類對父類的繼承是通過在類的聲明中,用關(guān)鍵字extends來說明的。其語法形式為:
[ClassModifier] class ClassName extends SuperClassName [implements interface]
{
子類的屬性和方法;
}
其中:關(guān)鍵字extends說明要聲明的類需要繼承父類的屬性和行為,SuperClassName是被繼承的父類的名稱。
Java 要求聲明的每個類都有父類,當(dāng)沒有顯示的指定父類時,父類隱含為java.lang.Object。一個父類可以同時擁有多個子類,這是該父類實際上是所有子類的公共屬性和方法的集合,而每一個子類則是父類的特殊化,是在公共屬性的基礎(chǔ)上的功能(方法),內(nèi)涵(屬性(變量))的擴展和延伸。
Java不支持類的多重繼承,只支持類的單繼承。即每個子類只能有一個直接父類。類的層次結(jié)構(gòu)為樹狀結(jié)構(gòu),Object類為樹的根節(jié)點。
二 封裝性
封裝是指將從現(xiàn)實世界中抽象得到的數(shù)據(jù)成員和代碼成員相結(jié)合,形成一個有機的整體,即將數(shù)據(jù)與操作數(shù)據(jù)的行為進(jìn)行有機的結(jié)合。在面向?qū)ο蟪绦蛟O(shè)計中,可以通過封裝,將一部分成員作為類與外部的接口,將其他的成員隱藏起來,以達(dá)到對數(shù)據(jù)訪問權(quán)限的有效控制。
(1) C++
在C++中,封裝是借助于類(Class)來實現(xiàn)的。對象是類類型的數(shù)據(jù),即為類的實例。C++中聲明類的語法如下:
Class 類名稱{
Public :
外部接口;
Protected:
保護型成員;
Private:
私有成員;
};
(2) java
在java中,封裝也是借助于類(Class)來實現(xiàn)的。對象是類類型的數(shù)據(jù),即為類的實例。java中聲明類的語法如下:
[public][abstract | final] class 類名稱 [extends 父類名稱] [implements 接口名稱列表]{
變量成員聲明及初始化;
方法聲明及方法實現(xiàn)(方法體);
}
其中:
Class是關(guān)鍵字,表明其后聲明的是一個類。
Class前的修飾符可以有多個,用來限定類的使用方式。Public為存取控制符,表明此類為公有類,abstract指明此類為抽象類,final指明此類為終結(jié)類。
類名稱是用戶為該類所起的名字,它應(yīng)該是一個合法的標(biāo)識符,并盡量遵從命名約定。
Extends是關(guān)鍵字,如果所聲明的類是從某一個父類派生而來的,那么父類的名字應(yīng)寫在extends之后。
Implements是關(guān)鍵字,如果所聲明的類要實現(xiàn)某些接口,那么接口的名字應(yīng)寫在implements之后。
類的聲明體中有兩部分,一部分是數(shù)據(jù)成員變量的聲明及初始化,可以有多個;另一部分是成員方法的聲明及實現(xiàn),也可以有多個。
三 多態(tài)性
多態(tài)的主要意思是:“一個名字,多種語義;或相同的界面,多種實現(xiàn)”。多態(tài)性是一種方法,使在多個類中可以定義一個操作和屬性名,并在每一個類中有不同的實現(xiàn)。正式的說法就是:同一個消息被不同的對象接收時,可產(chǎn)生不同的動作或執(zhí)行結(jié)果,即每個對象將根據(jù)自己所屬類中定義的操作執(zhí)行。
(1) C++
C++中的多態(tài)性有兩種情況:一種是編譯時多態(tài)性,它是由重載函數(shù)支持的,強調(diào)的是函數(shù)名相同,函數(shù)參數(shù)和函數(shù)體不同。函數(shù)調(diào)用與函數(shù)體的匹配在編譯時就能確定。另一種是運行時多態(tài)性,這是由虛函數(shù)支持的,它強調(diào)的是完全單一的界面,不同的實現(xiàn);即函數(shù)名,返回類型,函數(shù)參數(shù)類型,順序,個數(shù)完全相同,但函數(shù)體不同。這種情況下,函數(shù)調(diào)用與函數(shù)體的匹配在運行時才能確定。
函數(shù)重載:兩個或兩個以上的函數(shù),取相同的函數(shù)名,但是形參的個數(shù)或者類型不同,編譯器根據(jù)實參和形參的類型及個數(shù)的最佳匹配,自動確定調(diào)用哪一個函數(shù)。C++允許功能相近的函數(shù)在相同的作用域內(nèi)以相同的函數(shù)名定義(不同的作用域內(nèi)的同名函數(shù)不是重載,此時其生命周期就不一樣),從而形成重載。
虛函數(shù):是使用virtual關(guān)鍵字來限定的非靜態(tài)的成員函數(shù),虛函數(shù)經(jīng)過派生之后,在類簇中就可以實現(xiàn)運行過程中的多態(tài)。如果需要通過基類的指針指向派生類的對象,并訪問某個與基類同名的成員(若為函數(shù),其原型完全相同),那么首先在基類中將這個同名函數(shù)定義為虛函數(shù)。這樣,就可以通過基類類型的指針,來訪問該同名的函數(shù),使得屬于不同派生類的不同對象產(chǎn)生不同的行為,從而實現(xiàn)運行過程的多態(tài)。虛函數(shù)定義語法如下:
Virtual 函數(shù)返回值類型 函數(shù)名稱(形參列表){
函數(shù)體(函數(shù)的實現(xiàn));
}
虛函數(shù)的聲明只能出現(xiàn)在類聲明的函數(shù)原型聲明之前,而不能在函數(shù)體實現(xiàn)的時候才聲明。只要在基類中聲明,而不要在派生類中再聲明。若派生類沒有顯式的給出虛函數(shù)聲明,此時系統(tǒng)會自動的按照以下規(guī)則來判斷一個函數(shù)是不是虛函數(shù):
.該函數(shù)是否與基類的虛函數(shù)有相同的名稱;
.該函數(shù)是否與基類的虛函數(shù)有相同的參數(shù)個數(shù)及相同的對應(yīng)參數(shù)類型;
.該函數(shù)是否與基類的虛函數(shù)有相同的返回值或者滿足賦值兼容規(guī)則的指針,引用型的返回值。
如果從名稱,參數(shù)和返回值三方面檢查之后,派生類的函數(shù)滿足了上述條件,就被自動確定為虛函數(shù)。
運行過程中的多態(tài)需要滿足以下三個條件:①類之間應(yīng)滿足賦值兼容規(guī)則(指在需要基類對象的任何地方都可以使用公有派生類的對象來代替,這種代替包括:派生類的對象可以賦值給基類的對象;派生類的對象可以初始化基類的引用;派生類對象的地址可以賦給指向基類的指針。在替代之后,派生類的對象就可以作為基類的對象來使用,但只能使用從基類繼承來的成員,即在基類出現(xiàn)的場合可以使用派生類進(jìn)行代替,但是代替之后派生類僅僅發(fā)揮出基類的作用);②要在基類中聲明虛函數(shù);③要由成員函數(shù)來調(diào)用或者是通過指針,引用來訪問虛函數(shù)。(如果是使用對象名來訪問虛函數(shù),則聯(lián)編在編譯過程中就可以進(jìn)行(靜態(tài)聯(lián)編),而無需在運行過程中進(jìn)行)
(2) java
在java 中,利用向上塑型(type-casting)技術(shù)(類型轉(zhuǎn)換),任何一個子類的對象或引用變量都可以被塑型((自動的)類型轉(zhuǎn)換)為其父類的對象,即一個父類的對象或引用變量可以指向不同的子類對象,而利用動態(tài)綁定(dynamic Binding)技術(shù)(可以在程序運行期間判斷對象的類型,并根據(jù)其所屬的實際類型分別調(diào)用其真實類型的適當(dāng)?shù)姆椒ǎ藭r方法的調(diào)用與該方法的主體連接在一起(綁定binding)),可以在運行時根據(jù)父類對象或引用變量所指對象的實際類型執(zhí)行相應(yīng)的子類中的方法,從而實現(xiàn)多態(tài)性。