2009-11-07 191 views
1

看到下面的代碼:將這項工作類型轉換C++

ap = &abr; 

爲什麼這裏的代碼使用動態轉換從here

採取

void simple_dynamic_casts() 
{ 
    AB ab; 

    B* bp = (B*)&ab; // cast needed to break protection 
    A* ap = &ab;  // public derivation, no cast needed 

    AB& abr = dynamic_cast<AB&>(*bp); // succeeds 

    ap = dynamic_cast<A*>(bp);   assert(ap != NULL); 
    bp = dynamic_cast<B*>(ap);   assert(bp == NULL); 
    ap = dynamic_cast<A*>(&abr);  assert(ap != NULL); 
    bp = dynamic_cast<B*>(&abr);  assert(bp == NULL); 
} 

代碼。我還沒有試過編譯這段代碼。

+0

爲什麼-1表示 – 2009-11-07 18:44:19

回答

3

他們使用dynamic_cast顯示它做什麼。所以,這就是你的「爲什麼」問題的答案。

否則,該網頁給出的解釋是不正確。您嘗試使用的資源要麼嚴重過時,要麼與某些特定的質量較差的編譯器綁定。在頁面頂部的「新興的C++標準......」等字是一個死衚衕。 C++標準在11年前成爲現實。 (意思是說網站是不是C++一般和特別dynamic_cast一個很好的資源,如果這是你在找什麼。)

這裏是他們的類定義

class A   { public: virtual void f(); }; 
class B   { public: virtual void g(); }; 
class AB :  public virtual A, private B { }; 

演員

AB& abr = dynamic_cast<AB&>(*bp); // they say: succeeds 

不是成功。它將拋出bad_cast例外,因爲B不是AB的公共基類。 dynamic_cast不能用於打倒downcasts中的保護。

鑄造

bp = dynamic_cast<B*>(&abr); 

甚至不會編譯,因爲非法upcasts(斷裂保護)甚至被dynamic_cast在編譯時拒絕(即,代碼是形成不良的)。請注意,在這種情況下,dynamic_cast沒有什麼特別之處。對於upcasts,dynamic_cast相當於static_cast或完全不播放。由於B是一個私人的基地,上述演員將不會編譯。作者似乎錯誤地認爲在這種情況下dynamic_cast應該返回空指針。

至於ap = &abr - 是的,它會奏效。它沒什麼錯,只要AAB的公共基地。

+0

well bp = dynamic_cast (ap)確實會編譯。然而斷言失敗。 – 2009-11-07 19:12:40

+0

糟糕...不應該包含該演員。這是一個十字架,而不是一個倒戈。我修好了它。謝謝。 – AnT 2009-11-07 19:18:59

1

是的。一個指向類的指針總是可以隱式轉換爲指向公共基類的指針;在這種情況下,您將從AB*轉換爲A*。允許使用dynamic_cast,但不是必需的。

這與第二次轉換沒有什麼不同(A* ap = &ab;)。

該代碼使用dynamic_cast來說明如何工作。

0

爲什麼代碼在這裏使用動態投射。

dynamic_cast運算符允許您在運行時檢查轉換是否有效。如果不是,它將返回null(因此調用assert())。

將這項工作

試試看... :)