Casting des pointeurs vers void*
a son importance depuis le chemin du retour dans C jours.
Le plus approprié est également à l'intérieur du gestionnaire de mémoire du Système d'Exploitation. Il a pour stocker tout le pointeur et l'objet de ce que vous créez. En les stockant dans le vide* ils généraliser pour stocker n'importe quel objet sur le gestionnaire de mémoire de la structure de données qui pourrait être heap/B+Tree
ou simple arraylist
.
Pour des raisons de simplicité prends l'exemple de la création d'un list
de génériques éléments(Liste contient des éléments de complètement différentes classes). Ce serait possible seulement à l'aide de void*
.
la norme dit que dynamic_cast doit retourner la valeur null pour illégaux de conversion de type standard et garantit également que tout pointeur doit être en mesure de saisir la convertir en void* et à l'arrière de avec seule exception de pointeurs de fonction.
Normal niveau de l'application pratique d'utilisation est très inférieur pour l' void*
typecasting mais il est largement utilisé dans les bas niveaux/systèmes embarqués.
Normalement, vous pouvez utiliser reinterpret_cast pour les bas niveau de stuff, comme dans 8086 il est utilisé pour compenser le pointeur de la même base pour obtenir l'adresse, mais pas limité à cela.
Edit:
La norme dit que vous pouvez convertir n'importe quel pointeur void*
même avec dynamic_cast<>
mais pas là où les états que vous ne pouvez pas convertir l' void*
de retour à l'objet.
Pour la plupart d'utilisation, son sens unique de la rue mais il y a quelques inévitables d'utilisation.
Il dit simplement qu' dynamic_cast<>
des besoins d'informations de type pour le reconvertir au type demandé.
Il existe de nombreuses API qui vous obligent à passer void*
à un objet par exemple. java/Jni Code passe l'objet en tant que void*
.
Sans info on ne peut pas faire le casting.Si vous êtes assez confiant que le type demandé est correct, vous pouvez demander au compilateur de faire l' dynmaic_cast<>
avec un truc.
Regardez ce code:
class Base_Class {public : virtual void dummy() { cout<<"Base\n";} };
class Derived_Class: public Base_Class { int a; public: void dummy() { cout<<"Derived\n";} };
class MostDerivedObject : public Derived_Class {int b; public: void dummy() { cout<<"Most\n";} };
class AnotherMostDerivedObject : public Derived_Class {int c; public: void dummy() { cout<<"AnotherMost\n";} };
int main () {
try {
Base_Class * ptr_a = new Derived_Class;
Base_Class * ptr_b = new MostDerivedObject;
Derived_Class * ptr_c,*ptr_d;
ptr_c = dynamic_cast< Derived_Class *>(ptr_a);
ptr_d = dynamic_cast< Derived_Class *>(ptr_b);
void* testDerived = dynamic_cast<void*>(ptr_c);
void* testMost = dynamic_cast<void*>(ptr_d);
Base_Class* tptrDerived = dynamic_cast<Derived_Class*>(static_cast<Base_Class*>(testDerived));
tptrDerived->dummy();
Base_Class* tptrMost = dynamic_cast<Derived_Class*>(static_cast<Base_Class*>(testMost));
tptrMost->dummy();
//tptrMost = dynamic_cast<AnotherMostDerivedObject*>(static_cast<Base_Class*>(testMost));
//tptrMost->dummy(); //fails
} catch (exception& my_ex) {cout << "Exception: " << my_ex.what();}
system("pause");
return 0;
}
Veuillez me corriger si ce n'est pas correct en aucune façon.