如果我們現(xiàn)在在設(shè)計(jì)一個(gè)項(xiàng)目
比如需要處理動(dòng)物,我們會(huì)這樣設(shè)計(jì)
????????????????????? ----->?? lizard class???? 蜥蜴
class animal
?????????????????????? -----> chicken class?? 雞
class
?Animal

{
????pubulic:
?????????Animal
&
?
operator
?
=
?(
const
?Animal
&
?rhs);
?????????
}
;
class
?Lizard:
public
?Animal

{
?????
public
:
?????????Lizard
&
?
operator
=
(
const
?Lizard
&
?ths);
?????????
.
}
;
class
?Chichen:
public
?Animal

{
??????
public
:
??????Chichen
&
?
operator
=
(
const
?Chichen
&
?rhs);
??????
}
;
現(xiàn)在我們只演示操作符
現(xiàn)在如果有這樣一短代碼
Animal* p1 = new Lizard;
Animal* p2 = new Chichen;
如果執(zhí)行p1 = p2,只有p1的animal部分會(huì)被修改,Lizard的其他menber沒有被改變,這個(gè)是正常的部分賦值現(xiàn)象。
但是實(shí)際上我們不希望結(jié)果是這樣,
如果要執(zhí)行繼承類的operator = 的話,你得在base class 中抽象"="
virtual Animal
&?operator?=?(const?Animal&?rhs);
同樣在繼承類中virtual ?Chicken
&?operator=(const?Chicken&?ths);
virtual ?Lizard
&??? operator=(const Lizard&?ths);????? //virtual 在繼承類中可以省略,但是仍然是抽象的,只是有了實(shí)現(xiàn)體而已
這樣我們就能實(shí)現(xiàn)p1 = p2(我們把一只雞賦給了蜥蜴,典型的異型賦值);
雖然在 C++中有強(qiáng)烈的型別轉(zhuǎn)換,但是這在C++中是允許的,Animal的virtual "="為異型賦值打開了大門
我們希望當(dāng)
Animal* pAnimal1= new Lizard;
Animal* pAnimal2= new Lizard;
...
*pAnimal1 =? *pAnimal2;?? //呵呵,將蜥蜴給了蜥蜴
但是我們不希望這樣的事情發(fā)生
Animal* pAnimal1= new Lizard;
Animal* pAnimal2= new Chichen;
...
*pAnimal1 =? *pAnimal2;?? //呵呵,將小雞給了蜥蜴
編譯器不能發(fā)現(xiàn)問(wèn)題,但是在運(yùn)行期會(huì)造成錯(cuò)誤。
所以我們希望當(dāng)出現(xiàn)異型賦值的時(shí)候,operator = 能對(duì)此做一個(gè)判斷
現(xiàn)在我們能通過(guò) dynamic_cast實(shí)現(xiàn)我們的愿望
Lizard& Lizard::operator = (const Animal&? ths)
{
??????const Lizard& rhs_liz = dynamic_cast<const Lizard&>(rhs);
??????//如果轉(zhuǎn)型失敗,dynamic_cast會(huì)向外拋出Bad_cast exception
}
這個(gè)操作是可行的,但是對(duì)于每次賦值操作都是昂貴復(fù)雜的似乎有點(diǎn)不劃算。
所以我們可以重載下operator = ,只對(duì)右邊參數(shù)為多態(tài)形式的指針或引用做dynamic_cast的處理
而對(duì)于同型別的指針或者引用 我們則只需要進(jìn)行copy,copy而已。
so ,我們得有這個(gè):
Lizard& operator = (const Lizard& rhs);
然而對(duì)于這樣的設(shè)計(jì),Effective C++提出了疑問(wèn),某些編譯器并沒有支持dynamic_cast,還有對(duì)于exception的捕獲大多數(shù)程序員并不是太注重這樣的設(shè)計(jì)。所以并不是最好的解決上面部分賦值的辦法。
Effective C++提供的模式是
???????????????????????????????????????????????????????????------> Lizard
再申請(qǐng)另外一個(gè)類AbstractAnimal???------> Animal
???????????????????????????????????????????????????????????------>?Chicken
讓AbstrctAnimal成為一個(gè)抽象類,一個(gè)無(wú)法被實(shí)體化的類,沒有任何menber function。Lizard,Animal和Chicken都繼承于AbstractAnimal.
這個(gè)設(shè)計(jì)禁止了部分賦值和異型賦值,derive class同樣可以調(diào)用base class? 的operator =;
AbstractAnimal 含有一個(gè)抽象類的必須----至少一個(gè)純虛函數(shù)。這里設(shè)計(jì)成他的Destructor.呵呵,這樣設(shè)計(jì)也是為了能很好的支持這些類的多態(tài)性,這個(gè)就不多說(shuō)了。
<附:文章非轉(zhuǎn)載,內(nèi)容雖然簡(jiǎn)單,請(qǐng)不要砸磚頭?????????????????????????? 醬菜 2007.02.03凌晨12.30>