BOOST庫中polymorphic_cast與polymorphic_downcast

來源:互聯網
上載者:User

多態轉型函數polymorphic_cast的用法與C++中的dynamic_cast類似。除了在轉型失敗時總是拋出一個std::bad_cast異常。

代碼 1 #include <iostream>
 2 #include <string>
 3 #include "boost/cast.hpp"
 4 
 5 class base1{
 6 public:
 7     virtual void print(){
 8         std::cout<<"base1::print()\n";
 9     }
10     virtual ~base1(){}
11 };
12 
13 class base2{
14 public:
15     void only_base2(){
16         std::cout<<"only_base2()\n";
17     }
18     virtual ~base2(){}
19 };
20 
21 class derived : public base1, public base2{
22 public:
23     void print(){
24         std::cout<<"derived::print()\n";
25     }
26     void only_here(){
27         std::cout<<"derived::only_here()\n";
28     }
29     void only_base2(){
30         std::cout<<"Oops, here too!\n";
31     }
32 };
33 
34 int main()
35 {
36     base1* p1 = new derived;
37     p1->print();
38     try
39     {
40         // 從基類向衍生類別轉換 [2010/8/30 19:10:24]
41         derived* pD = boost::polymorphic_cast<derived*>(p1);
42         pD->only_here();
43         pD->only_base2();
44         // 交叉轉型,從一個基類轉換到另一個基類 [2010/8/30 19:10:50]
45         base2* pB = boost::polymorphic_cast<base2*>(p1);
46         pB->only_base2();
47     }
48     catch (std::bad_cast& e)
49     {
50         std::cout<<e.what()<<'\n';
51     }
52     delete p1;
53     return 0;
54 }

 

 寫代碼時突然發現有polymorphic_downcast函數的提示,通過函數名字猜測用途,為了比較它與polymorphic_cast的區別做了如下實驗:

1 derived* pD2 = boost::polymorphic_downcast<derived*>(p1);
2 pD2->only_here();
3 base2* pB2 = boost::polymorphic_downcast<base2*>(p1);
4 pB2->only_base2();

 

 如果類之間不存在繼承關係的轉換則會提示如下錯誤:

 error C2440: '==' : cannot convert from 'base1 *' to 'base2 *' X:\boost\cast.hpp97

error C2440: 'static_cast' : cannot convert from 'base1 *' to 'base2 *'X:\boost\cast.hpp98

這兩個轉型函數的實現代碼如下:

 代碼

 polymorphic_downcast函數內部實現上對於轉換進行了斷言,還有最重要的區別是polymorphic_downcast函數是通過C++中static_cast進行轉換,而polymorphic_cast是通過dynamic_cast。這就需要說一下c++中的static_cast和dynamic_cast兩個轉型操作符。static_cast被看做是在向下轉型過程中效率高於dynamic_cast的操作符,但是同樣也帶來了風險。dynamic_cast在失敗時會返回null 指標或是Null 參考,而static_cast在使用時完全由使用者保證轉換的可靠性,這種引入的錯誤是潛在的並不明顯,編譯會毫不猶豫地一切通過。

 代碼

 上面的這個例子也很好的解釋了polymorphic_downcast在cast.hpp檔案中前面那一段注釋的意思啦。所以polymorphic_downcast在使用static_cast之前加入了斷言,在編譯器一級通過dynamic_cast驗證轉型的可靠性,這是對直接使用static_cast的所帶來危險的保障實現,但是效率上就會降低。除了你對效能有要求同時對於轉型很肯定,那麼就直接使用static_cast,否則還是用dynamic_cast或是polymorphic_cast吧。

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.