Curso de programación en C moderno
Transcripción
Curso de programación en C moderno
Portada Ejemplo Curso de programación en C moderno El objetivo (II Edición) La forma Herencia Estructura de ficheros Encapsulación Neira Ayuso, Pablo Polimorfismo Punteros a funciones Métodos Constructor vehicle Constructor car Destructores Tema 12 Objetos (II): Herencia Índice Portada Ejemplo El objetivo La forma Herencia Estructura de ficheros Encapsulación Polimorfismo Punteros a funciones Métodos Constructor vehicle Constructor car Destructores Falgueras García, Carlos 1 Ejemplo de herencia 2 El objetivo 3 La forma 4 Herencia Estructura de ficheros Encapsulación 5 Polimorfismo Punteros a funciones Métodos Constructor vehicle Constructor car Destructores Ejemplo de herencia Portada Ejemplo El objetivo La forma Herencia Estructura de ficheros Encapsulación Polimorfismo Punteros a funciones Métodos Constructor vehicle Constructor car Destructores El objetivo Portada 1 2 3 4 Ejemplo 5 6 El objetivo 7 La forma 8 9 Herencia 10 Estructura de 11 ficheros 12 Encapsulación 13 Polimorfismo 14 15 Punteros a funciones 16 Métodos Constructor vehicle Constructor car Destructores #i n c l u d e " v e h i c l e . h " #i n c l u d e " c a r . h " i n t main ( ) { s t r u c t v e h i c l e ∗v ; s t r u c t v e h i c l e ∗c ; v = v e h i c l e _ a l l o c ( " 1234 ABC" ) ; c = ( s t r u c t v e h i c l e ∗ ) c a r _ a l l o c ( " 4321 CBA" , " p i c k u p " ) ; vehicle_print (v) ; vehicle_print (c) ; }; return 0; > ./ vehicles Vehicle { p l a t e = " 1234 ABC" } C ar { p l a t e = " 4321 CBA" type = " pickup " } La forma Portada Ejemplo El objetivo La forma Herencia Estructura de ficheros Encapsulación Polimorfismo Punteros a funciones Métodos Constructor vehicle Constructor car Destructores • Encapsular la estructura del objeto padre en la del objeto hijo para implementar la herencia • Utilizar punteros a funciones para implementar el polimorfismo: Un puntero guardará una función u otra en función del tipo de objeto Herencia Portada Ejemplo El objetivo La forma Herencia Estructura de ficheros Encapsulación Polimorfismo Punteros a funciones Métodos Constructor vehicle Constructor car Destructores HERENCIA Estructura de ficheros Portada Ejemplo El objetivo La forma Herencia Estructura de ficheros Encapsulación Polimorfismo Punteros a funciones Métodos Constructor vehicle Constructor car Destructores Encapsulación Portada vehicle_int.h 1 2 3 Ejemplo 4 5 El objetivo 6 La forma 7 8 Herencia 9 Estructura de 10 ficheros 11 Encapsulación Polimorfismo Punteros a funciones Métodos Constructor vehicle Constructor car Destructores #i n c l u d e < s t d i n t . h> struct vehicle { char ∗ plate ; uint32_t f l a g s ; }; enum v e h i c l e _ a t t r { VEHICLE_PLATE , }; car.c 1 2 3 4 5 6 7 8 9 10 11 #i n c l u d e " v e h i c l e _ i n t . h " struct car { s t r u c t v e h i c l e s u p e r ; /∗ S i e m p r e char ∗ type ; uint32_t f l a g s ; }; enum c a r _ a t t r { CAR_TYPE, }; el p r i m e r o ∗/ Encapsulación Portada Ejemplo El objetivo La forma Herencia Estructura de ficheros Encapsulación Polimorfismo Punteros a funciones Métodos Constructor vehicle Constructor car Destructores struct vehicle *v = (struct vehicle *)car_alloc(...); Polimorfismo Portada Ejemplo El objetivo La forma Herencia Estructura de ficheros Encapsulación Polimorfismo Punteros a funciones Métodos Constructor vehicle Constructor car Destructores POLIMORFISMO Punteros a funciones Portada 1 2 3 Ejemplo El objetivo La forma Herencia Estructura de ficheros Encapsulación Polimorfismo Punteros a funciones Métodos Constructor vehicle Constructor car Destructores 4 5 6 7 8 #i f n d e f _VEHICLE_INT_ #d e f i n e _VEHICLE_INT_ #i n c l u d e < s t d i n t . h> struct vehicle { char ∗ plate ; 9 v o i d (∗ s e t _ p l a t e ) ( s t r u c t v e h i c l e ∗ , const char ∗) ; const char ∗(∗ get_plate ) ( const s t r u c t v e h i c l e ∗) ; v o i d (∗ p r i n t ) ( const s t r u c t v e h i c l e ∗) ; 10 11 12 13 14 15 16 17 18 19 20 21 }; uint32_t f l a g s ; enum v e h i c l e _ a t t r { VEHICLE_PLATE , }; #e n d i f Métodos Portada 1 Ejemplo El objetivo La forma Herencia Estructura de ficheros Encapsulación Polimorfismo Punteros a funciones Métodos Constructor vehicle Constructor car Destructores 2 3 s t a t i c void default_print ( const struct { p r i n t f ( " V e h i c l e {" ) ; 4 i f (ATTR_IS_SET( v−>f l a g s , VEHICLE_PLATE ) ) p r i n t f ( " \n\ t p l a t e = \"% s \" " , v−>p l a t e ) ; 5 6 7 8 9 10 11 12 13 14 v e h i c l e ∗v ) } p r i n t f ( " \n }\ n" ) ; void vehicle_print ( const struct { v−>p r i n t ( v ) ; } v e h i c l e ∗v ) Nota: Para crear un método/clase abstract@ basta con no crear el/los método(s) por defecto Constructor vehicle Portada 1 2 3 Ejemplo El objetivo 4 6 7 Herencia 8 Polimorfismo Punteros a funciones Métodos Constructor vehicle Constructor car Destructores 9 10 11 12 13 14 } v = ( s t r u c t v e h i c l e ∗) malloc ( s i z e o f ( s t r u c t i f (! v) r e t u r n NULL ; 16 17 18 19 vehicle )) ; vehicle_init (v , plate ) ; 20 21 23 default_set_plate (v , plate ) ; s t r u c t v e h i c l e ∗ v e h i c l e _ a l l o c ( const char ∗ plate ) { s t r u c t v e h i c l e ∗v ; 15 22 v e h i c l e ∗v , c o n s t char ∗ p l a t e ) v−>s e t _ p l a t e = d e f a u l t _ s e t _ p l a t e ; v−>g e t _ p l a t e = d e f a u l t _ g e t _ p l a t e ; v−>p r i n t = d e f a u l t _ p r i n t ; 5 La forma Estructura de ficheros Encapsulación void vehicle_init ( struct { v−>f l a g s = 0 ; } return v ; Constructor car Portada 1 Ejemplo El objetivo La forma Herencia Estructura de ficheros Encapsulación Polimorfismo Punteros a funciones Métodos Constructor vehicle Constructor car Destructores 2 3 s t r u c t car ∗ car_alloc ( const char ∗ plate , const char ∗ type ) { s t r u c t car ∗c ; 4 c = ( s t r u c t car ∗) malloc ( s i z e o f ( s t r u c t car ) ) ; i f (! c) r e t u r n NULL ; 5 6 7 8 v e h i c l e _ i n i t (&c−>s u p e r , p l a t e ) ; 9 10 c−>f l a g s = 0 ; c−>s u p e r . p r i n t = c a r _ p r i n t f ; car_set_type ( c , type ) ; 11 12 13 14 15 16 } return c ; Destructores Portada vehicle Ejemplo El objetivo 1 2 3 La forma 4 Herencia 5 Estructura de ficheros Encapsulación 6 7 Polimorfismo Punteros a funciones Métodos Constructor vehicle Constructor car Destructores void v e h i c l e _ f r e e ( s t r u c t v e h i c l e ∗v ) { i f (ATTR_IS_SET( v−>f l a g s , VEHICLE_PLATE ) ) f r e e ( v−>p l a t e ) ; } free (v) ; car 1 2 3 4 5 6 void car_free ( s t r u c t car ∗c ) { i f (ATTR_IS_SET( c−>f l a g s , CAR_TYPE) ) f r e e ( c−>t y p e ) ; v e h i c l e _ f r e e (&c−>s u p e r ) ; }