C++繼承與組合詳解
我們知道,在一個(gè)類中可以用類對(duì)象作為數(shù)據(jù)成員,即子對(duì)象(詳情請(qǐng)查看:C++有子對(duì)象的派生類的構(gòu)造函數(shù))。實(shí)際上,對(duì)象成員的類型可以是本派生類的基類,也可以是另外一個(gè)已定義的類。在一個(gè)類中以另一個(gè)類的對(duì)象作為數(shù)據(jù)成員的,稱為類的組合(composition)。
例如,聲明Professor(教授)類是Teacher(教師)類的派生類,另有一個(gè)類BirthDate(生日),包含year,month,day等數(shù)據(jù)成員。可以將教授生日的信息加入到Professor類的聲明中。如:
class Teacher //教師類{public: // Some Codeprivate: int num; string name; char sex;};class BirthDate //生日類{public: // Some Codeprivate: int year; int month; int day;};class Professor:public Teacher //教授類{public: // Some Codeprivate: BirthDate birthday; //BirthDate類的對(duì)象作為數(shù)據(jù)成員};類的組合和繼承一樣,是軟件重用的重要方式。組合和繼承都是有效地利用已有類的資源。但二者的概念和用法不同。通過繼承建立了派生類與基類的關(guān)系,它是一種 “是”的關(guān)系,如“白貓是貓”,“黑人是人”,派生類是基類的具體化實(shí)現(xiàn),是基類中的一 種。通過組合建立了成員類與組合類(或稱復(fù)合類)的關(guān)系,在本例中BirthDate是成員類,Professor是組合類(在一個(gè)類中又包含另一個(gè)類的對(duì)象成員)。它們之間不是‘‘是”的 關(guān)系,而是“有”的關(guān)系。不能說教授(Professor)是一個(gè)生日(BirthDate),只能說教授(Professor)有一個(gè)生日(BirthDate)的屬性。
Professor類通過繼承,從Teacher類得到了num,name,age,sex等數(shù)據(jù)成員,通過組合,從BirthDate類得到了year,month,day等數(shù)據(jù)成員。繼承是縱向的,組合是橫向的。
如果定義了Professor對(duì)象prof1,顯然prof1包含了生日的信息。通過這種方法有效地組織和利用現(xiàn)有的類,大大減少了工作量。如果有
void fun1(Teacher &); void fun2(BirthDate &);
在main函數(shù)中調(diào)用這兩個(gè)函數(shù):
fun1(prof1); //正確,形參為Teacher類對(duì)象的引用,實(shí)參為Teacher類的子類對(duì)象,與之賦值兼容 fun2(prof1.birthday); //正確,實(shí)參與形參類型相同,都是BirthDate類對(duì)象 fun2(prof1); //錯(cuò)誤,形參要求是BirthDate類對(duì)象,而prof1是Professor類型,不匹配
如果修改了成員類的部分內(nèi)容,只要成員類的公用接口(如頭文件名)不變,如無必要,組合類可以不修改。但組合類需要重新編譯。
繼承在軟件開發(fā)中的重要意義
繼承是面向?qū)ο蠹夹g(shù)的重要內(nèi)容,有了繼承,使軟件的重用成為可能。
過去,軟件人員開發(fā)新的軟件,能從已有的軟件中直接選用完全符合要求的部件不 多,一般都要進(jìn)行許多修改才能使用,實(shí)際上有相當(dāng)部分要重新編寫,工作童很大??s短軟件開發(fā)過程的關(guān)鍵是鼓勵(lì)軟件重用。繼承機(jī)制解決了這個(gè)問 主站蜘蛛池模板: 阜宁县| 广灵县| 宾川县| 凭祥市| 临夏市| 屏山县| 淳安县| 荔波县| 绥中县| 孝感市| 化德县| 林西县| 隆尧县| 海淀区| 溧阳市| 铁岭市| 同仁县| 津市市| SHOW| 望谟县| 闽侯县| 广元市| 灯塔市| 仲巴县| 长治县| 大兴区| 锡林郭勒盟| 安多县| 牡丹江市| 汶川县| 新田县| 嘉禾县| 鸡泽县| 黄石市| 古交市| 方城县| 凭祥市| 开封市| 绵竹市| 高州市| 清新县|