Transtypage en C++ Flashcards

1
Q

Qu’est-ce que le transtypage (casting) d’un pointeur en C++?

A

Le transtypage d’un pointeur consiste à faire en sorte que le compilateur considère un pointeur d’un type comme étant un pointeur vers un autre type. Généralement, un transtypage se fait du haut vers le bas dans une hiérarchie de classes (puisque ce n’est pas nécessaire du bas vers le haut).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Pourquoi n’est-il généralement pas opportun de transtyper deux types qui ne sont pas reliés?

A

Il n’est généralement pas opportun de transtyper deux types qui ne sont pas reliés car cela peut conduire à des comportements indéfinis et des erreurs difficiles à déboguer, puisque les structures des deux types non reliés peuvent être totalement différentes.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Comment effectue-t-on un transtypage classique en C++ et quelle est sa limitation principale?

A

Le transtypage classique s’effectue à l’aide de l’opérateur (), par exemple: B ptrB = (B) ptrA;. Sa limitation principale est qu’il permet de transtyper n’importe quel type vers n’importe quel type sans vérification par le compilateur de la faisabilité du transtypage, ce qui peut mener à des erreurs à l’exécution.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Qu’est-ce que static_cast et quel avantage offre-t-il par rapport au transtypage classique?

A

static_cast est un opérateur de transtypage qui s’assure à la compilation que le transtypage est valide. Par exemple: B ptrB = static_cast<B>(ptrA);. Il offre une validation à la compilation qui peut prévenir certaines erreurs, contrairement au transtypage classique qui ne fait aucune vérification.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Quelle est la limite de la validation effectuée par static_cast?

A

La validation effectuée par static_cast se fait à l’aide des types utilisés et non de ce qu’on y place concrètement. Par exemple, A ptrC = new C(); B ptrB = static_cast<B>(ptrC); va compiler même si C n’hérite pas de B, car le compilateur voit seulement que ptrC est de type A, qui est la classe parente de B.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Qu’est-ce que dynamic_cast et comment se différencie-t-il des autres méthodes de transtypage?

A

dynamic_cast est un opérateur qui permet de transtyper en effectuant une vérification à l’exécution et de manière plus profonde. Dans l’éventualité où le transtypage ne fonctionne pas, nullptr est retourné. Contrairement à static_cast qui vérifie uniquement à la compilation, dynamic_cast vérifie pendant l’exécution si l’objet est réellement du type vers lequel on essaie de le convertir.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Quel est l’inconvénient principal de l’utilisation de dynamic_cast?

A

L’inconvénient principal de dynamic_cast est que la vérification à l’exécution ajoute des instructions et a un coût de performances. Il vaut mieux l’utiliser avec parcimonie, surtout au niveau d’instructions appelées fréquemment dans la boucle de jeu.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly