Dans le code suivant, tout en construisant Si je vous ai confondu avec ma description ci-dessus, pourquoi ne code> obj code> doit-il être polymorphique lors de la mise au rebut, mais en le désactivant est-ce que em> doit être polymorphique tout en utilisant obj code> dans le cas 1, nous construisons également un objet de classe code> dérivé code>, mais ses fonctions membres sont simplement inaccessibles à
obj < / code>. Donc, alors que dans le cas de la rédaction (c'est-à-dire dans le cas 2), en utilisant
obj code> comme source, nous avons le code> dérivé code> dans celui-ci déjà. Pourquoi
OBJ CODE> doit-il être polymorphique?
dynamic_cast code>? p>
4 Réponses :
à partir de 5.2.7 / 1 [expr.dynamic.cast]:
Le résultat de l'expression
dynamic_cast
(v) code> est le résultat de la conversion de l'expression v en tapez T. P> [...] p>
si T est "pointeur sur cv1 em> b" et v de type "pointeur sur cv2 em> d" tel que B est une classe de base de D, le résultat est un pointeur sur le sous-objet B unique de l'objet D pointé vers par v. p>
[...] p>
sinon fort>, v doit être un pointeur sur ou un lvalue d'un type polymorphe. P> blockQuote>
La norme fournit même l'exemple suivant illustrant que l'exigence de type polymorphe ne signifie pas dérivée à la conversion de base: p>
xxx pré> p>
Pour que Le moyen le plus simple autour de cela consiste à signaler le destructeur de la classe de base comme virtuel. P>
Upcasting (c'est-à-dire dérivé à la base) n'a pas besoin d'une distribution car le compilateur est capable de vérifier que la distribution fonctionnerait au moment de la compilation. Cependant, la même chose n'est pas vraie lorsque la sous-cuve. P>
Vous pouvez souscrire avec static_cast code> dans cet exemple. Vous savez à la compilation que
obj code> contient la bonne classe. L'utilisation de dynamic_cast est lorsque vous ne connaissez pas au moment de la compilation si l'objet est dérivé d'un autre. Par exemple, lorsque vous obtenez un pointeur hors d'une fonction et devez vérifier si l'objet renvoyé appartient à une certaine classe. (Mais vous avez raison, ils doivent être virtuels.)
dynamic_cast p>
Vous devez en savoir plus sur dynamic_cast (avec exemple) Il . P >
class car { public: virtual void drive() { std::cout <<"car"<<std::endl; } }; class toyota: public car { public: virtual void drive() { std::cout <<"toyota"<<std::endl; } }; class honda: public car { public: virtual void drive() { std::cout <<"honda"<<std::endl; } }; template <typename Tderived> Tderived* dynamicCast(void* pBase) { //compare the vptr of the class pointed by pBase with a temporary Tderived class. //If vptr of pBase and vptr of Tderived() are pointing to the same vtable //then it can be safely deduced that pBase is indeed pointing to an instance of Tderived if (*(int**)pBase == *(int**)&Tderived()) { return (Tderived*)pBase; } else { return nullptr; } } int main() { car* pCar; honda hondaCar; toyota toyotaCar; pCar = &toyotaCar; honda* pHonda = dynamicCast<honda>(pCar); if (nullptr != pHonda) { pHonda->drive(); } else { toyota* pToyota = dynamicCast<toyota>(pCar); if (nullptr != pToyota) { pToyota->drive(); } } }