Dynamic_cast

Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från versionen som granskades den 24 juli 2013; kontroller kräver 19 redigeringar .


I programmeringsspråket C++ konverterar en operation en datatyp (pekare eller referens) ner i arvshierarkin (från en förfadertyp till en underordnad typ), och kontrollerar om casten är giltig med hjälp av dynamisk datatypsidentifiering . Denna typ av omvandling kallas en "down cast" eftersom den flyttar pekaren ner i klasshierarkin från basklassen till den härledda klassen. dynamic_cast

Till skillnad från vanlig C -stil gjutning , validering av typ gjutning görs under körning . Operatören dynamic_castkan appliceras på pekare eller referenser . Huvudsyftet dynamic_castär att konvertera en pekare som innehåller adressen till ett överordnat objekt till en pekare av typen underobjekt. Om konverteringen inte är möjlig (typerna är inte relaterade), kommer en nollpekare att erhållas . När man arbetar med referenser , om typkonverteringen inte är möjlig, kommer ett std::bad_cast- undantag att kastas. Således uppvisar operatören dynamic_casten likhet i typkonverteringsproceduren med ett programmeringsspråk såsom Java , i motsats till C , som inte kontrollerar korrektheten av typkonverteringen vid körning.

Exempel

Anta att en funktion tar ett objekt av en typ Asom ett argument och behöver utföra lite extra arbete om objektet som skickas till funktionen faktiskt är ett objekt av typen som Bärver från klassen A. Detta beteende kan uppnås när det används dynamic_castpå följande sätt.

Nedslagen:

#include <typeinfo> // För std::bad_cast #include <iostream> // För std::cerr etc. klass A { offentliga : // Den dynamiska datatypsidentifieringsmekanismen är endast tillgänglig för polymorfa //-klasser (dvs klasser som innehåller minst en virtuell medlemsfunktion) virtual void foo (); // andra klassmedlemmar... }; klass B : offentlig A { offentliga : void methodSpecificToB (); // andra klassmedlemmar... }; void my_function ( A & my_a ) { Prova { B & my_b = dynamic_cast < B &> ( my_a ); min_b . methodSpecificToB (); } catch ( const std :: bad_cast & e ) { std :: cerr << e . what () << std :: endl ; std :: cerr << "Detta objekt är inte ett objekt av typ B" << std :: endl ; } }

Liknande kod för en funktion my_functionkan skrivas med hjälp av pekare istället för referenser :

void my_function ( A * my_a ) { B * my_b = dynamic_cast < B *> ( my_a ); om ( min_b ) my_b -> methodSpecificToB (); annan std :: cerr << "Detta objekt är inte ett objekt av typ B" << std :: endl ; }

Möjliga logiska misstag

Fel är möjliga om konverteringen inte ägde rum (operationen returnerade NULL eller ett bad_cast-undantag kastades), och programmet inte är redo för detta.

Se även

Länkar