賦值兼容規(guī)則是指在需要基類對象的任何地方都可以使用公有派生類的對象來替代,。通過公有繼承,,派生類得到了基類中除構(gòu)造函數(shù)、析構(gòu)函數(shù)之外的所有成員,,而且所有成員的訪問控制屬性也和基類完全相同,。這樣,公有派生類實際就具備了基類的所有功能,,凡是基類能解決的問題,,公有派生類都可以解決。賦值兼容規(guī)則中所指的替代包括以下的情況: ·派生類的對象可以賦值給基類對象,。 ·派生類的對象可以初始化基類的引用,。 ·派生類對象的地址可以賦給指向基類的指針。 在替代之后,,派生類對象就可以作為基類的對象使用,,但只能使用從基類繼承的成員。 如果B類為基類,,D為B類的公有派生類,則D類中包含了基類B中除構(gòu)造,、析構(gòu)函數(shù)之外的所有成員,這時,,根據(jù)賦值兼容規(guī)則,, 在基類B的對象可以使用的任何地方,都可以用派生類的對象來替代,。在如下程序中,, b1為B類的對象,d1為D的對象,。 clasS B {…} class D:public B {…} B b1,,*pbl; D d1,; 這時: ①派生類對象可以賦值給基類對象,,即用派生類對象中從基類繼承來的成員,逐個賦值給基類對象的成員: b1=d1,; ②派生類的對象也可以初始化基類對象的引用: B &bb=d1,; ③派生類對象的地址也可以賦給指向基類的指針: pb1=&d1; 由于賦值兼容規(guī)則的引入,對于基類及其公有派生類的對象,,我們可以使用相同的函數(shù)統(tǒng)一進行處理(因為當(dāng)函數(shù)的形參為基類的對象時,, 實參可以是派生類的對象), 而沒有必要為每一個類設(shè)計單獨的模塊,,從而大大提高了程序的效率,。 這正是C++的又一重要特色,,即多態(tài)性,可以說,,賦值兼容規(guī)則是多態(tài)性的重要基礎(chǔ)之一,。 例:賦值兼容規(guī)則實例。 本例中,,基類B0以公有方式派生出B1類,,B1類再作為基類以公有方式派生出D1類,基類B0中定義了成員函數(shù)display(),, 在派生類中對這個成員函數(shù)進行了覆蓋,。程序代碼如下: //** chap13_2.cpp #include.h> class B0 //基類B0聲明 { publiC: v0id display(){c0ut<<"B0::display()"<;} //公有成員函數(shù) },; class B1:publicB0 //公有派生類B1聲明 { public: v0id display(){c0ut<<"Bi::display()"<,;} //公有成員函數(shù) }; class D1:public B1 //公有派生類B1聲明 { public: v0id display(){c0ut<<”D1::display()”<,;} //公有成員函數(shù) },; v0id fun(B0 *ptr) //普通函數(shù) { //參數(shù)為指向基類對象的指針 ptr->display(); //”對象指針—>成員名” } v0id main() //主函數(shù) { B0 b0,; //聲明B0類對象 B1 bl,; //聲明B1類對象
D1 dl; //聲明D1類對象 B0 *p,; //聲明B0類指針 p=&b0,; //B0類指針指向B0類對象 fun(p); p=&b1,; //B0類指針指向B1類對象 fun(p),; p=&d1; //B0類指針指向D土類對象 fun(p),; } 這樣,,通過“對象名.成員名”或者“對象指針->成員名”的方式,就可以訪問到各派生類中新添加的同名成員,。雖然根據(jù)賦值兼容原則,,可以將派生類對象的地址賦值給基類B0的指針,但是通過這個基類類型的指針,,卻只能訪問到從基類繼承的成員,。 在程序中,定義了一個形參為基類B0類型指針的普通函數(shù)fun,, 根據(jù)賦值兼容規(guī)則,可以將公有派生類對象的地址賦值給基類類型的指針,,這樣,,使用fun函數(shù)就可以統(tǒng)一對這個類族中的對象進行操作,。 程序運行過程中,分別把基類對象,、 派生類B1的對象和派生類D1的對象賦值給基類類型指針p,,但是,通過指針p,,只能使用繼承下來的基類成員,。也就是說,盡管指針指向派生類D1的對象,,fun函數(shù)運行時通過這個指針只能訪問到D1類從基類B0繼承過來的成員函數(shù)display,,而不是D1類自己的同名成員函數(shù)。因此,,主函數(shù)中三次調(diào)用函數(shù)fun的結(jié)果是同樣的——訪問了基類的公有成員函數(shù),。程序的運行結(jié)果為:
B0::display B0::display B0::display
通過這個例子,我們看到,,根據(jù)賦值兼容規(guī)則,,我們可以在基類出現(xiàn)的場合使用派生類進行替代,但是替代之后派生類僅僅發(fā)揮出基類的作用,。多態(tài)的設(shè)計方法可以保證在賦值兼容的前提下,,基類、派生類分別以不同的方式來響應(yīng)相同的消息,。
|