Vi un libro en C++ que mencionaba que navegar por las jerarquías de herencia mediante el envío estático es más eficiente que usar el lanzamiento dinámico.Elenco estático frente a modelo dinámico para recorrer las jerarquías de herencia
Ejemplo:
#include <iostream>
#include <typeinfo>
using namespace std;
class Shape { public: virtual ~Shape() {}; };
class Circle : public Shape {};
class Square : public Shape {};
class Other {};
int main() {
Circle c;
Shape* s = &c; // Upcast: normal and OK
// More explicit but unnecessary:
s = static_cast<Shape*>(&c);
// (Since upcasting is such a safe and common
// operation, the cast becomes cluttering)
Circle* cp = 0;
Square* sp = 0;
// Static Navigation of class hierarchies
// requires extra type information:
if(typeid(s) == typeid(cp)) // C++ RTTI
cp = static_cast<Circle*>(s);
if(typeid(s) == typeid(sp))
sp = static_cast<Square*>(s);
if(cp != 0)
cout << "It's a circle!" << endl;
if(sp != 0)
cout << "It's a square!" << endl;
// Static navigation is ONLY an efficiency hack;
// dynamic_cast is always safer. However:
// Other* op = static_cast<Other*>(s);
// Conveniently gives an error message, while
Other* op2 = (Other*)s;
// does not
} ///:~
Sin embargo, tanto reparto dinámico y vaciado estático (tal como se aplica arriba) necesario activar RTTI para dicha navegación funcione. Es solo que el molde dinámico requiere que la jerarquía de clases sea polimórfica (es decir, que la clase base tenga al menos una función virtual).
¿De dónde viene esta ganancia de eficiencia para el molde estático? El libro menciona que el lanzamiento dinámico es la forma preferida para realizar downcasting seguro de tipos.
Ow my eyes. ¿Sangrado? –
Transmitiría su mensaje al autor del libro. – Ankur
El molde C-Style '(Other *) s' es esencialmente lo mismo que' reinterpret_cast (s) 'en este caso, por eso se compila sin previo aviso (esencialmente le está diciendo al compilador que no se preocupe, usted sabe lo que están haciendo) –
Attila