Portada
Ejemplo El objetivo La forma
Curso de programación en C moderno (II Edición)
Herencia Estructura de ficheros Encapsulación
Polimorfismo Punteros a funciones Métodos Constructor vehicle Constructor car Destructores
Neira Ayuso, Pablo
Falgueras García, Carlos
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
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" } Car { 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
Polimorfismo Punteros a funciones Métodos Constructor vehicle Constructor car Destructores
Neira Ayuso, Pablo
Falgueras García, Carlos
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
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" } Car { 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
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_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 ;
vehicle )) ;
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 ) ; }