第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

C ++中的dynamic_cast和static_cast

C ++中的dynamic_cast和static_cast

C++
喵喵時光機 2019-08-29 08:48:43
C ++中的dynamic_cast和static_cast我dynamic_cast對C ++中的關(guān)鍵字很困惑。struct A {     virtual void f() { }};struct B : public A { };struct C { };void f () {     A a;     B b;     A* ap = &b;     B* b1 = dynamic_cast<B*> (&a);  // NULL, because 'a' is not a 'B'     B* b2 = dynamic_cast<B*> (ap);  // 'b'     C* c = dynamic_cast<C*> (ap);   // NULL.     A& ar = dynamic_cast<A&> (*ap); // Ok.     B& br = dynamic_cast<B&> (*ap); // Ok.     C& cr = dynamic_cast<C&> (*ap); // std::bad_cast}定義說:該dynamic_cast關(guān)鍵字從一個指針或引用類型到另一個蒙上了基準(zhǔn),執(zhí)行運行時檢查以確保鑄造的有效性我們可以dynamic_cast在C中編寫一個等效的C ++,以便我能更好地理解事物嗎?
查看完整描述

3 回答

?
慕標(biāo)5832272

TA貢獻1966條經(jīng)驗 獲得超4個贊

這是一個簡介static_cast<>,dynamic_cast<>特別是它們與指針有關(guān)。這只是一個101級的破舊,它并沒有涵蓋所有錯綜復(fù)雜的內(nèi)容。

static_cast <Type *>(ptr)

ptr會將指針接入并嘗試將其安全地轉(zhuǎn)換為類型的指針Type*。這個演員表是在編譯時完成的。如果類型類型相關(guān),它將僅執(zhí)行強制轉(zhuǎn)換。如果類型不相關(guān),則會出現(xiàn)編譯器錯誤。例如:

class B {};class D : public B {};class X {};int main(){
  D* d = new D;
  B* b = static_cast<B*>(d); // this works
  X* x = static_cast<X*>(d); // ERROR - Won't compile
  return 0;}

dynamic_cast <Type *>(ptr)

這再次嘗試將指針插入ptr并安全地將其轉(zhuǎn)換為類型的指針Type*。但是這個演員表是在運行時執(zhí)行的,而不是編譯時。因為這是一個運行時轉(zhuǎn)換,所以特別是在與多態(tài)類組合時非常有用。實際上,在certian情況下,類必須是多態(tài)的,以使轉(zhuǎn)換合法。

演員可以進入兩個方向之一:從基礎(chǔ)到派生(B2D)或從派生到基礎(chǔ)(D2B)。這很簡單,可以看到D2B強制轉(zhuǎn)換如何在運行時運行。要么ptr是源于,Type要么不是。在D2B dynamic_cast <> s的情況下,規(guī)則很簡單。您可以嘗試將任何內(nèi)容轉(zhuǎn)換為其他內(nèi)容,如果ptr實際上是派生出來的Type,那么您將獲得一個Type*指針dynamic_cast。否則,您將獲得一個NULL指針。

但是B2D演員陣容有點復(fù)雜。請考慮以下代碼:

#include <iostream>using namespace std;class Base{public:
    virtual void DoIt() = 0;    // pure virtual
    virtual ~Base() {};};class Foo : public Base{public:
    virtual void DoIt() { cout << "Foo"; }; 
    void FooIt() { cout << "Fooing It..."; }};class Bar : public Base{public :
    virtual void DoIt() { cout << "Bar"; }
    void BarIt() { cout << "baring It..."; }};Base* CreateRandom(){
    if( (rand()%2) == 0 )
        return new Foo;
    else
        return new Bar;}int main(){
    for( int n = 0; n < 10; ++n )
    {
        Base* base = CreateRandom();

            base->DoIt();

        Bar* bar = (Bar*)base;
        bar->BarIt();
    }
  return 0;}

main()不知道什么樣的對象CreateRandom()會返回,所以C風(fēng)格的演員Bar* bar = (Bar*)base;陣容絕對不是類型安全的。你怎么能解決這個問題?一種方式是像布爾函數(shù)添加AreYouABar() const = 0;到基類,并返回trueBarfalseFoo。但還有另一種方法:使用dynamic_cast<>

int main(){
    for( int n = 0; n < 10; ++n )
    {
        Base* base = CreateRandom();

        base->DoIt();

        Bar* bar = dynamic_cast<Bar*>(base);
        Foo* foo = dynamic_cast<Foo*>(base);
        if( bar )
            bar->BarIt();
        if( foo )
            foo->FooIt();
    }
  return 0;}

強制轉(zhuǎn)換在運行時執(zhí)行,并通過查詢對象來工作(無需擔(dān)心現(xiàn)在如何),詢問它是否是我們正在尋找的類型。如果是,則dynamic_cast<Type*>返回指針; 否則返回NULL。

為了使這個基礎(chǔ)到派生的轉(zhuǎn)換能夠使用dynamic_cast<>,Base,F(xiàn)oo和Bar必須是Standard所謂的多態(tài)類型。要成為多態(tài)類型,您的類必須至少具有一個virtual函數(shù)。如果您的類不是多態(tài)類型,dynamic_cast則不會編譯從基礎(chǔ)到派生的使用。例:

class Base {};class Der : public Base {};int main(){
    Base* base = new Der;
    Der* der = dynamic_cast<Der*>(base); // ERROR - Won't compile

    return 0;}

向基礎(chǔ)添加虛擬功能(例如虛擬dtor)將同時生成Base和Der多態(tài)類型:

class Base {public:
    virtual ~Base(){};};class Der : public Base {};int main(){
    Base* base = new Der;
    Der* der = dynamic_cast<Der*>(base); // OK

    return 0;}


查看完整回答
反對 回復(fù) 2019-08-29
?
侃侃無極

TA貢獻2051條經(jīng)驗 獲得超10個贊

除非您實現(xiàn)自己的手動RTTI(并繞過系統(tǒng)),否則無法dynamic_cast直接在C ++用戶級代碼中實現(xiàn)。dynamic_cast與C ++實現(xiàn)的RTTI系統(tǒng)密切相關(guān)。

但是,為了幫助您理解RTTI(以及dynamic_cast更多),您應(yīng)該閱讀<typeinfo>標(biāo)題和typeid操作符。這將返回與您手頭的對象相對應(yīng)的類型信息,您可以從這些類型的信息對象中查詢各種(有限的)事物。


查看完整回答
反對 回復(fù) 2019-08-29
?
桃花長相依

TA貢獻1860條經(jīng)驗 獲得超8個贊

不僅僅是C中的代碼,我認(rèn)為英語定義就足夠了:

給定一個類Base,它有一個派生類Derived,dynamic_cast當(dāng)且僅當(dāng)指向的實際對象實際上是Derived對象時,才會將Base指針轉(zhuǎn)換為Derived指針。

class Base { virtual ~Base() {} };class Derived : public Base {};class Derived2 : public Base {};class ReDerived : public Derived {};void test( Base & base ){
   dynamic_cast<Derived&>(base);}int main() {
   Base b;
   Derived d;
   Derived2 d2;
   ReDerived rd;

   test( b );   // throw: b is not a Derived object
   test( d );   // ok
   test( d2 );  // throw: d2 is not a Derived object
   test( rd );  // ok: rd is a ReDerived, and thus a derived object}

在示例中,調(diào)用test將不同的對象綁定到引用Base。在內(nèi)部,參考downcasted的引用Derived類型安全方式:喪氣將只對那些情況下,被引用的對象確實是一個實例成功Derived。


查看完整回答
反對 回復(fù) 2019-08-29
  • 3 回答
  • 0 關(guān)注
  • 516 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號