c++ inheritance polymorphism vtable

c++ - ¿No se puede abatir porque la clase no es polimórfica?



inheritance polymorphism (5)

Errores de sintaxis no dynamic_cast no se puede dynamic_cast un tipo no polimorfo. static_cast es el elenco que static_cast en este caso, si sabes que en realidad es un objeto del tipo objetivo.

La razón por la cual: static_cast básicamente hace que el compilador realice una comprobación en el momento de la compilación "¿Se podría enviar la entrada a la salida?" Esto se puede usar para los casos en los que está lanzando hacia arriba o hacia abajo una jerarquía de herencia de punteros (o referencias). Pero la verificación es solo en tiempo de compilación, y el compilador supone que usted sabe lo que está haciendo.

dynamic_cast solo se puede usar en el caso de un puntero o un molde de referencia, y además de la verificación de tiempo de compilación, hace un control de tiempo de ejecución adicional de que el lanzamiento es legal. Requiere que la clase en cuestión tenga al menos 1 método virtual, que permite al compilador (si es compatible con RTTI) realizar esta comprobación adicional. Sin embargo, si el tipo en cuestión no tiene ningún método virtual, entonces no se puede usar.

El caso más simple, y que probablemente valga la pena si está aprobando punteros como este, es considerar la posibilidad de hacer que el destructor de la clase base sea virtual. Además de permitirle usar el molde dinámico, también permite llamar a los destructores apropiados cuando se elimina un puntero de clase base.

¿Es posible tener herencia sin métodos virtuales? El compilador dice que el siguiente código no es polimórfico.

Ejemplo:

Class A(){ int a; int getA(){return a;}; } Class B(): A(){ int b; int getB(){return b;}; }

En otra clase estamos tratando de disminuir de un objeto A a un objeto B :

A *a; B *b = dynamic_cast<B*>(a)

pero esto da el siguiente error:

cannot dynamic_cast ... (source type is polymorphic)


Necesita al menos un método virtual en una clase para la run-time type information (RTTI) de run-time type information (RTTI) para aplicar con éxito el operador dynamic_cast.


sí, dynamic_cast para tipos no polimórficos no está permitido. La clase base debe tener al menos un método virtual. Solo entonces esa clase puede llamarse polimórfica.

Este artículo explica un ejemplo similar: http://www.cplusplus.com/doc/tutorial/typecasting/


simplemente haz que A destructor sea virtual (siempre hazlo para cualquier clase solo por seguridad).


A a; B *b = dynamic_cast<B*>(a)

Aquí a es un objeto yb es un puntero.

En realidad, tanto la transmisión ascendente como la descendente están permitidas en C ++. Pero al usar downcasting, se deben prestar atención a 2 cosas: 1 La superclase debe tener al menos un método virtual. 2 Como la superclase es "más pequeña" que la subclase, se debe usar el objeto de memoria con cuidado.