uso de static_cast

Uso de static_cast
Sintaxis:
static_cast <type-name> (expresión) La
conversión es legal solo si el tipo-nombre se puede convertir implícitamente al tipo al que pertenece la expresión, o si la expresión se puede convertir implícitamente al tipo al que pertenece el tipo-nombre . De lo contrario, el compilador informará de un error.
Puede asignar la dirección de un objeto de clase derivada heredado al puntero de clase base. Incluso si no hay una función virtual en la clase base, static_cast se puede utilizar para la conversión.
La dirección del objeto de clase base heredado se puede asignar al puntero de clase derivada. Debido a que los punteros de clase derivada se pueden convertir implícitamente en punteros de clase base sin conversión de tipo explícita, static_cast se puede usar para convertir en la otra dirección, es decir, para convertir punteros de clase base en punteros de clase derivada. Pero, ¿de qué sirve hacer esto?
De la misma manera, dado que los valores de enumeración se pueden convertir implícitamente en tipos integrales sin conversión de tipo explícita, static_cast se puede utilizar para convertir tipos integrales en tipos de enumeración.
Si la dirección de un objeto sin relación de herencia se asigna a un puntero de otra clase, el compilador informará un error.
Consulte el código uno:

#include<cstdio>
class Base{
  int dat;
public:
  explicit Base(int val) : dat(val){
    printf("%s, this=%p\n", __func__, this);
  }
#if 0
  virtual void act(){
#else
  void act(){
#endif
    printf("%s, this=%p\n", __func__, this);
  }
};
class Sub : public Base{
public:
  explicit Sub(int val) : Base(val){
    printf("%s, this=%p\n", __func__, this);
  }
};
class Other{
  int dat;
public:
  explicit Other(int val) : dat(val){
    printf("%s, this=%p\n", __func__, this);
  }
};
int main(){
  Base obase(1);
  Sub osub(2);
  Base *pbase = NULL;
  if(pbase = static_cast<Base *>(&osub) ){
    pbase->act();
  }
  
 printf("---------------\n");
  Base *ptr = &osub;
  ptr->act();
 printf("---------------\n");
#if 1
  if(Sub *psub = static_cast<Sub *>(&obase) ){
    psub->act();
  }
#endif
#if 0
  Other oother(3);
  //error: invalid static_cast from type ‘Other*’ to type ‘Base*’
  if(pbase = static_cast<Base *>(&oother) ){
    pbase->act();
  }
#endif 
}

Resultados de la prueba:

frank @ userver: ~ / proyecto / prueba / cpp / rtti $ ./a.out          

Base, esto = 0x7fff6d478100

Base, esto = 0x7fff6d478110

Sub, esto = 0x7fff6d478110

acto, esto = 0x7fff6d478110

---------------

acto, esto = 0x7fff6d478110

---------------

actuar, esto = 0x7fff6d478100

Código dos:

#include<cstdio>
int main(){
  enum eSource{
    eAuxSource = 0,
    eOpticalSource,
    eBtSource,
    eFcSource,
    eSpotifySource,
    eGcSource
  };
#if 0
  eSource src = eBtSource;
#else
  //eSource src = 3; //error: invalid conversion from ‘int’ to ‘main()::eSource’ [-fpermissive]
  eSource src = static_cast<eSource>(3.1);
#endif
  printf("src: %p, %lu, %d\n", &src, sizeof(src), src);
}

 

Emprenda la programación en Matlab, Python y C ++, aprendizaje automático, implementación y orientación de la teoría de la visión por computadora, tanto títulos de pregrado como de maestría, comercio de pescado salado, respuestas profesionales, por favor, comuníquese con QQ número 757160542 para obtener más detalles, si usted es el indicado.

 

 

Supongo que te gusta

Origin blog.csdn.net/weixin_36670529/article/details/115053523
Recomendado
Clasificación