【正文】
函數(shù)。Microsoft 公司的COM規(guī)范的核心是接口設(shè)計(jì),COM的接口就相當(dāng)于類(lèi)的公有函數(shù)[Rogerson 1999]。在程序設(shè)計(jì)方面,咱們不要懷疑Microsoft公司的風(fēng)格。設(shè)計(jì)孤立的類(lèi)是比較容易的,難的是正確設(shè)計(jì)基類(lèi)及其派生類(lèi)。因?yàn)橛行┏绦騿T搞不清楚“繼承”(Inheritance)、“組合”(Composition)、“多態(tài)”( Polymorphism)這些概念。 繼承與組合如果A是基類(lèi),B是A的派生類(lèi),那么B將繼承A的數(shù)據(jù)和函數(shù)。示例程序如下: class A{ public: void Func1(void)。 void Func2(void)。}。class B : public A{ public: void Func3(void)。 void Func4(void)。}。 // Example main(){ B b。 // B的一個(gè)對(duì)象 ()。 // B從A繼承了函數(shù)Func1 ()。 // B從A繼承了函數(shù)Func2 ()。 ()。}這個(gè)簡(jiǎn)單的示例程序說(shuō)明了一個(gè)事實(shí):C++的“繼承”特性可以提高程序的可復(fù)用性。正因?yàn)椤袄^承”太有用、太容易用,才要防止亂用“繼承”。我們要給“繼承”立一些使用規(guī)則:一、如果類(lèi)A和類(lèi)B毫不相關(guān),不可以為了使B的功能更多些而讓B繼承A的功能。不要覺(jué)得“白吃白不吃”,讓一個(gè)好端端的健壯青年無(wú)緣無(wú)故地吃人參補(bǔ)身體。二、如果類(lèi)B有必要使用A的功能,則要分兩種情況考慮:(1)若在邏輯上B是A的“一種”(a kind of ),則允許B繼承A的功能。如男人(Man)是人(Human)的一種,男孩(Boy)是男人的一種。那么類(lèi)Man可以從類(lèi)Human派生,類(lèi)Boy可以從類(lèi)Man派生。示例程序如下: class Human{ …}。 class Man : public Human{ …}。 class Boy : public Man{ …}。(2)若在邏輯上A是B的“一部分”(a part of),則不允許B繼承A的功能,而是要用A和其它東西組合出B。例如眼(Eye)、鼻(Nose)、口(Mouth)、耳(Ear)是頭(Head)的一部分,所以類(lèi)Head應(yīng)該由類(lèi)Eye、Nose、Mouth、Ear組合而成,不是派生而成。示例程序如下: class Eye{ public: void Look(void)。 }。 class Nose{ public: void Smell(void)。 }。 class Mouth{ public: void Eat(void)。 }。 class Ear{ public: void Listen(void)。 }。 // 正確的設(shè)計(jì),冗長(zhǎng)的程序 class Head{ public: void Look(void) { ()。 } void Smell(void) { ()。 } void Eat(void) { ()。 } void Listen(void) { ()。 } private: Eye m_eye。 Nose m_nose。 Mouth m_mouth。 Ear m_ear。}。 如果允許Head從Eye、Nose、Mouth、Ear派生而成,那么Head將自動(dòng)具有Look、 Smell、Eat、Listen這些功能: // 錯(cuò)誤的設(shè)計(jì)class Head : public Eye, public Nose, public Mouth, public Ear{}。上述程序十分簡(jiǎn)短并且運(yùn)行正確,但是這種設(shè)計(jì)卻是錯(cuò)誤的。很多程序員經(jīng)不起“繼承”的誘惑而犯下設(shè)計(jì)錯(cuò)誤。一只公雞使勁地追打一只剛下了蛋的母雞,你知道為什么嗎?因?yàn)槟鸽u下了鴨蛋。“運(yùn)行正確”的程序不見(jiàn)得就是高質(zhì)量的程序,此處就是一個(gè)例證。 虛函數(shù)與多態(tài)除了繼承外,C++的另一個(gè)優(yōu)良特性是支持多態(tài),即允許將派生類(lèi)的對(duì)象當(dāng)作基類(lèi)的對(duì)象使用。如果A是基類(lèi),B和C是A的派生類(lèi),多態(tài)函數(shù)Test的參數(shù)是A的指針。那么Test函數(shù)可以引用A、B、C的對(duì)象。示例程序如下: class A{ public: v