重載解析參考自《C++程序設(shè)計語言》、《Microsoft C++語言參考》
重載解析的使用不會跨越不同類的作用域。來自不同基類的函數(shù)之間的歧義性不能基于參數(shù)類型完成解析。如果需要在不同的基類中使用同名函數(shù),需要在使用前使用命名空間聲明。(如果參數(shù)相同怎么辦?)
多繼承多重繼承提供比單繼承更好的靈活性,但是需要在引用部分成員是添加限定。多重繼承主要要關(guān)注歧義性問題。因為C++查找成員的順序是如果不能將名稱解析為顯示引用的類中的成員,編譯器就會到該類的基類中找,此時會有三種結(jié)果,找到、找不到、有歧義。
虛繼承要求多態(tài)性的操作對象。因為非多態(tài)性的操作對象不包含類型信息。
能夠保存一定的運行時需要的對象的類型信息,用于在類的繼承和組合關(guān)系中進(jìn)行安全的轉(zhuǎn)換。
適用于基類與派生類之間的轉(zhuǎn)換,兄弟類之間的轉(zhuǎn)換,以及能夠由這兩種場景復(fù)合構(gòu)成的轉(zhuǎn)換。(向上強(qiáng)制、向下強(qiáng)制、交叉強(qiáng)制)。
由于實現(xiàn)的是安全的類型轉(zhuǎn)換,所以通過if(C2* pc2 = dynamic_cast
,判斷指針在類型轉(zhuǎn)換之后的返回值是否為0,來確定是否實現(xiàn)了安全的類型轉(zhuǎn)換。對于引用的轉(zhuǎn)換的合法性,則通過dynamic_cast
本身檢查。如果不能實現(xiàn)轉(zhuǎn)換,則會拋出bad_cast
,可以通過try...catch
塊設(shè)置處理器進(jìn)行處理。
另外由于編譯器不能對void*
所指向的存儲提供任何保證,所以dynamic_cast
不能實現(xiàn)從void*
出發(fā)的強(qiáng)制轉(zhuǎn)換,因為編譯器需要去查看對象,確定類型。此時需要使用static_cast
進(jìn)行轉(zhuǎn)換。
到void*
的synamic_cast可以用于確定多態(tài)類型的對象的起始地址。
如果需要跨系統(tǒng)保存一個非多態(tài)類型的對象的類型信息,可以將非多態(tài)類型的對象包裝在一個要穿過的系統(tǒng)的基類中。然后在需要使用的時候,利用dynamic_cast將對象提取出來。例如:
class Io_obj{virtual Io_obj* clone() = 0;
};
class Io_date : public Date, public Io_obj{};
void f(Io_obj* pio){Date* pd = dynamic_cast(pio);
}
dynamic_cast
實現(xiàn)可用之前,有許多強(qiáng)制轉(zhuǎn)換通過其他機(jī)制保證安全。所以dynamic_cast實現(xiàn)的一些操作包含冗余。同時dynamic_cast
具有運行時開銷。void*
出發(fā)的強(qiáng)制轉(zhuǎn)換。dynamic_cast
保存更多類型信息你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
當(dāng)前題目:C++學(xué)習(xí)筆記——C++類層次結(jié)構(gòu)要點-創(chuàng)新互聯(lián)
URL鏈接:http://aaarwkj.com/article18/iccdp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、網(wǎng)站設(shè)計公司、電子商務(wù)、服務(wù)器托管、面包屑導(dǎo)航、虛擬主機(jī)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)