7
votes

Comment utiliser la tablette pour déterminer le type de classe

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 xxx

et vous instaniez a * pfoo = nouveau b () , est-il en effet possible d'utiliser la tablette totale Déterminez si PFOO contient un pointeur sur une instance de A ou B?


1 commentaires

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


4 Réponses :


12
votes

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 A ou B 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 ou B et déterminez la classe de l'objet de cette façon .

Pour illustrer (bien sûr, c'est tout ce qui est tout sauf bon style): xxx

IMPORT: Ceci est seulement 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 faire quelque chose comme celui-ci dans le code de production; Utilisez RTTI à la place.


0 commentaires

1
votes

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])();


2 commentaires

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?



4
votes

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.


0 commentaires

2
votes

vérifier le Fonction Typeid () .


0 commentaires