Errores, fallos, preguntas - página 1890
Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
Cuál es el error de ejecución
Así es, no se puede conducir de abajo a arriba, sólo de arriba a abajo. Esto es por seguridad.
No se puede comparar con C++: allí todo se puede reducir a cualquier cosa.
En C++ también funciona sólo si un puntero a una clase base apunta a su descendiente.
No sé qué quieres decir con eso, pero este código:
Así es, no se puede conducir de abajo a arriba, sólo de arriba a abajo. Esto es por seguridad.
No se puede comparar con C++: allí todo se puede reducir a cualquier cosa.
Ya lo tengo, gracias por la aclaración ))
No sé qué quieres decir con eso, pero este código:
Así es, no se puede conducir de abajo a arriba, sólo de arriba a abajo.
¿Quieres decir que no puedes hacer un casting de una clase base a una descendiente?
Sí, en caso de que la clase base no tenga un descendiente realmente construido.
Así es, no se puede conducir de abajo a arriba, sólo de arriba a abajo. Esto es por seguridad.
Sí.
Renat, ¿sabes qué es dynamic_cast?
Por supuesto.
Mira el trozo de código MQL5 comentado. Se crea una instancia base y luego se intenta convertir heroicamente vía dynamiccast a descendiente violando la seguridad. Bueno, es una pena, por supuesto.
El mismo ejemplo se discute y explica directamente en la documentación. El reparto dinámico en tiempo de ejecución se activa sólo después de comprobar el sistema de seguridad y la permisividad de las conversiones. Cada objeto MQL5 tiene toda la meta-información para comprobar los derechos en tiempo de ejecución. Esto no es un C++ vacío.
Conversión dinámica de tipos mediante el operador dynamic_cast
Es posible fundir dinámicamente los tipos utilizando el operador dynamic_cast, que sólo puede aplicarse a los punteros de clase. En este caso, la comprobación de la corrección de los tipos se realiza en el momento de la ejecución del programa. Significa que al utilizar el operador dynamic_cast el compilador no comprueba el tipo de datos utilizado para la conversión. Si se realiza la conversión de un puntero a un tipo de datos que no es el tipo real del objeto, el resultado será NULL.
dynamic_cast<tipo-id> ( expresión )
El parámetro type-id entre corchetes debe ser un puntero a un tipo de clase previamente definido . Eltipo de operando de la expresión (a diferencia de C++) puede ser cualquier cosa excepto void.
Ejemplo:
clase CBar { };
clase CFoo :public CBar { };
voidOnStart( )
{
Barra de CBar;
//--- se permite el reparto dinámico del tipo de puntero *bar a puntero *foo
CFoo *foo =dynamic_cast<CFoo*>(&bar);//--- no hay error crítico de ejecución
Print(foo);// foo=NULL
//--- intentar explícitamente lanzar una referencia del objeto Bar a un objeto Foo está prohibido
foo=(CFoo *)&bar;// se producirá un error de ejecución crítico
Print(foo);// esta línea no se ejecutará
}