溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C++如何使用dynamic_cast

發(fā)布時(shí)間:2021-11-26 15:48:41 來(lái)源:億速云 閱讀:122 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容主要講解“C++如何使用dynamic_cast”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“C++如何使用dynamic_cast”吧!

C.148:使用dynamic_cast進(jìn)行指針類型轉(zhuǎn)換時(shí),將不能發(fā)現(xiàn)目標(biāo)類看作是有效的選項(xiàng)

Reason(原因)

dynamic_cast轉(zhuǎn)換允許檢查是否指針指向一個(gè)在其繼承結(jié)構(gòu)中包含給定類的多態(tài)對(duì)象。由于轉(zhuǎn)換失敗的結(jié)果僅僅是返回一個(gè)空值,這個(gè)結(jié)果可以在執(zhí)行時(shí)檢查。這個(gè)特性允許根據(jù)結(jié)果選擇不同的路徑。和C.147不同,那里的失敗是錯(cuò)誤,而且不應(yīng)該被用于條件執(zhí)行。

Example(示例)

下面的例子描述的是Shape_owner的增加函數(shù),它接受構(gòu)造出來(lái)的Shape對(duì)象的所有權(quán)。對(duì)象也會(huì)在根據(jù)它們的幾何屬性有序加入views容器。在這個(gè)例子中,圖形沒(méi)有從幾何屬性繼承。只有它的子類這么做了。

void add(Shape* const item)
{
 // Ownership is always taken
 owned_shapes.emplace_back(item);

 // Check the Geometric_attributes and add the shape to none/one/some/all of the views

 if (auto even = dynamic_cast<Even_sided*>(item))
 {
   view_of_evens.emplace_back(even);
 }

 if (auto trisym = dynamic_cast<Trilaterally_symmetrical*>(item))
 {
   view_of_trisyms.emplace_back(trisym);
 }
}
Notes(注意)

尋找所需類的失敗會(huì)導(dǎo)致dynamic_cast返回一個(gè)空值,而解引用一個(gè)空指針會(huì)引起無(wú)定義的行為。因此應(yīng)該總是認(rèn)為dynamic_cast的結(jié)果可能為空并進(jìn)行檢查。

Enforcement(實(shí)施建議)
  • (復(fù)雜) 如果在dynamic_cast執(zhí)行之后,沒(méi)有對(duì)結(jié)果指針進(jìn)行空判斷,那么對(duì)使用這個(gè)指針的代碼報(bào)警。

到此,相信大家對(duì)“C++如何使用dynamic_cast”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI