J'étais récemment lors d'une interview pour un poste où C / C ++ est la langue principale et lors d'une question à laquelle on m'a dit qu'il est possible d'utiliser la tablette pour déterminer quelle classe dans une hiérarchie qu'un pointeur de base stocke réellement.
Donc si, par exemple, vous avez p> et vous instaniez a * pfoo = nouveau b () code>, est-il en effet possible d'utiliser la tablette totale Déterminez si PFOO contient un pointeur sur une instance de A ou B? P> P>
4 Réponses :
Ceci est évidemment dépendant de la mise en œuvre, mais sur la plupart des implémentations, la représentation en mémoire d'un objet de classe Pour illustrer (bien sûr, c'est tout ce qui est tout sauf bon style): p> IMPORT: Ceci est seulement em> une illustration de la plupart des implémentations travail; Outre la mise en œuvre dépendante, cette technique se décompose en présence de multiples héritage. Vous devriez jamais em> faire quelque chose comme celui-ci dans le code de production; Utilisez RTTI à la place. P> P> A code> ou
B code> commencera par un pointeur sur la tablette. Vous pouvez consulter ce pointeur à fourre-vtable, le comparer aux pointeurs à fourre-vtable pour des objets que vous connaissez comme étant de classe
A code> ou
B code> et déterminez la classe de l'objet de cette façon .
Vous pouvez accéder à VOWROPER et même vous pouvez appeler toute méthode virtuelle en classe via Vponponer. Mais rappelez-vous que c'est le mal.
Exemple: P>
A a; typedef void (__thiscall* foo)(); (*(foo)((void**)(((void**)(&a))[0]))[1])();
Wow !!!! C'est un brafling mais génial! Jamais aimerait avoir de telles questions sur l'entretien.
Et comment cela répond-il à la question concrète?
Oui, il est tout à fait possible de faire - utilisez dynamic_cast. C'est une jolie question de merde - un peu meilleure pourrait être "Comment est mise en œuvre dynamic_cast?" Mais vraiment si vous l'avez demandé soit lors d'une interview, je devais m'interroger sur l'accueil de l'intervieweur. Être un bien, voire un excellent programmeur C ++ ne dépend pas de connaître les détails de la mise en œuvre de Nitpicking comme celui-ci, mais celles-ci sont bien sûr des questions faciles à poser pour demander. P>
Merci pour les réponses. J'ai oublié de mentionner que j'ai demandé si RTTI était ce qu'ils cherchaient, et ils ont dit qu'en général, ils désactivent RTTI, donc ce n'est pas ça. Il est tout à fait possible que la solution qu'ils recherchaient était ce que Martin B décrit