C ++ (conversión de tipo pantalla) cuatro fundido

El viejo conversión de tipo tiene dos tipos (Efecto C ++)

// C estilo 
(T) expresión El 

(int) como en este ejemplo, A //
// estilo función T (expresión The)

DoSomeWork (Widget (15)) 15 como un argumento a esta clase Widget, crea una transformación a la operación Widget

El C ++ proporciona cuatro nueva conversión.

(1) const_cast: constantes utilizadas a cabo normalmente de un objeto, esta capacidad es la única C ++ estilo operador de conversión.

(2) dynamic_cast: se utiliza para punto para asegurar abatido

Este es, por ejemplo, hay una clase base, hay una gran cantidad de clases derivadas, herencia en este sistema, no se puede utilizar para determinar si un objeto que pertenece a la jerarquía de herencia de un cierto tipo (hacia abajo, es decir, la transición de un puntero a una clase base un puntero clase derivada)

Esta es la única acción que no puede ser realizada por el antiguo gramática, es la única gran acciones de reestructuración podría costar a los costos de operación.

El costo es muy alto.

(3) static_cast: se utiliza para forzar la conversión implícita.

Como la conversión de no-const objeto de destino const (no viceversa, se puede hacer solamente const_cast), o en el doble int similares, también se pueden escribir en el * puntero nulo a un puntero, el puntero-puntero-a-base en -to-derivado.

(4) reinterpret_cast: la intención de realizar la transición de bajo nivel, el efecto depende de la compilador.

Este tipo de conversión será re-interpretar el tipo de memoria para almacenar los datos, por ejemplo, tratamos de poner un enlace a un puntero int (es decir, un número entero en la memoria, sino que se utiliza para explicar como la dirección), debe interpretarse como un int que puede satisfacer todos los tipos de conversión, pero el resultado no está garantizado.

 

Transformación en realidad producir algo de código, tal como int y doble representación de diferentes formas, si hacemos la transición a duplicar el número de int, que los datos almacenados en la memoria serán ciertamente un cambio, se realiza un cambio en la memoria.

 

// no es una cosa interesante,

// clase base 
de clase Ventana {
 público :
   virtual  vacío onRize () {...} 
  ... 
} 

// clase derivada 
clase SpecialWindow: pública Ventana {
 público :
   virtual  vacío onResize () 
  { 
     // transición, tratando de llamar a la ventana de onRize ();
     // no funciona! 
    static_cast <la ventana> (* el este ) .onResize (); 
  } 

  ... // secialWindows comportamiento único 
}

En esta sección del programa de esperanza de que * Esta transición a la ventana, a continuación, llamar Ventana :: onResize. Una copia de una acciones temporales, pero en realidad, no es de las llamadas de función en los objetos de la corriente, pero la reestructuración anteriormente establecidos "* Base de este tema de la composición de clase" del cuerpo onResize

La función es la función, sólo una función miembro "que se opone al cuerpo de la llamada a la función," ¿qué importa, la clave es que tiene una función miembro (no estático) * este puntero afectará el funcionamiento de las funciones miembro de datos.

Así que de hecho! El que no está en el objeto actual, llamada ventana :: onResize, a continuación, realizar una acción exclusiva SecialWindow, al que llamó una copia temporal. Si Ventana :: onResize modificar el contenido del objeto, el objeto actual en realidad no cambia, el cambio es una copia. Y SecialWindow :: Si cambia un objeto, lo que realmente va a cambiar.

Para evitar esta situación por escrito, ya sea

 

Virtual  vacío onResize () 
{ 
   Ventana :: onResize (); // ventana de llamada :: onResize actúa en * este puntero 
}

 

 

Después // ----- dynamic_cast puede ser necesario añadir algunas cuestiones relevantes. Ver cherno de vídeos relacionados dynamic_cast

 

Supongo que te gusta

Origin www.cnblogs.com/EvansPudding/p/12566210.html
Recomendado
Clasificación