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 ) ;
}

Documentos relacionados