Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Objetivos:
Comprender la relación de herencia entre diversas clases durante el proceso de creación de un objeto a partir de
una subclase y el orden de las llamadas a partir del constructor de la clase base y el de los constructores subsecuentes de las
clases heredadas
Identificar cual es el orden en el que se ejecutan los constructores y destructores en base a su jerarquía, así como los tipos
de acceso que podemos implementar en las clases heredadas
Preguntas inicializadoras:
1
2
3
4
Introducción
Partiendo de que Un constructor es una función miembro que automáticamente es llamada cuando el objeto de la clase es creada o
instanciada y que los constructores son funciones miembro especiales que sirven para inicializar un objeto de una determinada clase en
el momento que se declara, no debemos olvidar que los constructores tienen el mismo nombre que la clase, no retornan ningún valor y
no pueden ser heredados.
Los constructores se pueden clasificar en constructores sin parámetros y con parámetros, un constructor por defecto se clasifica como
constructor sin parámetros, un constructor copia se puede considerar como un constructor con paramentos.
Constructores en herencia
Teniendo en cuenta que contamos con el mecanismo de herencia, el cual nos permite la reusabilidad de código y que en base a esta
propiedad podemos definir un tipo de dato de orden superior (clase padre o clase base, super clase) y a partir de estos podemos definir
datos derivados de clases de segundo nivel (clases derivadas, hijas o secundarias o sub clases), permitiéndonos la creación de modelos
y relaciones entre clases y diferentes tipos de jerarquías de herencia definidas para dar solución a problemas
Los constructores son métodos especiales que permiten definir la implementación para el estado inicial de creación de una instancia de
un objeto. La definición de un constructor, a diferencia de los métodos comunes es que no debe especificar el tipo de dato de retorno y
se identifican con el mismo nombre de la clase.
Debemos de recordar que para las clases base se debe declarar sus propios constructores. Y estos no se pueden heredar a las subclases,
sin embargo, desde una subclase se puede invocar los constructores de la clase base.
Esto implica que se requiere redefinir los constructores en La clase heredada y que se tiene que hacer explícitamente
Proceso de creación
1. Se crea la clase base y su constructor
2. Se crea una clase heredada con su constructor y llamando al constructor de la clase base
3. se crea un objeto de una clase heredada o derivada
4. se invoca al constructor de la clase base
5. se invoca al constructor de la clase derivada.
Cuando queremos inicializar las clases base usando parámetros desde el constructor de una clase heredada o derivada lo haremos de
modo como lo hacemos con los datos miembro, usaremos el constructor de la clase base con los parámetros adecuados.
si en una subclase se omite la construcción base después de la firma del constructor sin parámetros, se invoca el mismo constructor (sin
parámetros) de la clase base.
Destructores en herencia
Un destructor es una función miembro que se invoca automáticamente cuando el objeto queda fuera del alcance o es destruido
explícitamente por una llamada a eliminar. Un destructor tiene el mismo nombre que la clase, precedido por una tilde (~). Por ejemplo,
el destructor para la clase String se declara: ~ String ().
Si no define un destructor, el compilador proporcionará uno por defecto; Para muchas clases esto es suficiente. Solo necesita definir un
destructor personalizado cuando la clase almacena los manejadores de los recursos del sistema que deben liberarse o los punteros que
poseen la memoria a la que apuntan (memoria dinámica)
Orden de destrucción
Cuando un objeto queda fuera del alcance o se elimina, la secuencia de eventos en su destrucción completa es la siguiente:
#include <iostream>
using namespace std; Al crear un objeto de una clase heredada
primero se construye lo heredado en este caso
class Clase1 el dato1 y luego los propios atributos de la clase
{ derivada en este caso el dato 2
protected:
int dato1; El objeto creado en base a la clase 2 tiene
public: acceso a:
{
cout << "Constructor de Clase1" << endl;
}
int Leerclase1() {return dato1; }
};
public:
Clase2() : dato2(2) Clase2(int a, int b) : Clase1(a), dato2(b)
{
cout << "Constructor de Clase2" << endl;
}
};
int main()
{
Clase2 objeto;
return 0;
}
Caso 2 inicialización de clases bases y heredadas en Notas
constructores
#include <iostream>
using namespace std; Para poder inicializar el dato heredado, necesitamos redefinir el
constructor predeterminado tomando en cuenta los datos
class Clase1 { heredados
protected:
int dato1; //5
public:
Clase1(int a) : dato1(a) // constructor con parametros
{
cout << "Constructor de clase1" << endl;
}
public:
Clase2(int a, int b) : Clase1(a), dato2(b) // con paramaetros por
lo que esta redefiniendo al constructor de la clase base
{ //5 15
cout << "Constructor de clase2" << endl;
}
int Leer2() { return dato2; }
};
int main() {
Clase1 objeto1(10);
// Clase2 objeto2(5,15);
return 0;
}
Actividades
Actividad 1
int main()
{
int x=2, y=8;
par par1;
par par2(x,y);
return 0;
}
Actividad 2
#include <iostream>
using namespace std; 1. Conectar la línea de código con la acción
class ClaseA {
public:
Cuál es el orden de creación y destrucción de objetos
ClaseA() : datoA(10) {
cout << "Constructor de A" << endl;
} Análisis:
~ClaseA() { cout << "Destructor de A" << endl; }
int LeerA() const { return datoA; } Tenemos dos clases
return 0;
}
Actividad 3
#include <iostream>
using namespace std;
class base {
protected:
int i, j;
public:
void mostrar()
{
cout << i << " " << j << "\n";
}
};
public:
void setk()
{
k = i*j;
}
void mostrark() { cout << k << "\n"; }
};
public:
void setm() { m = i-j; }
void mostrarm() { cout << m << "\n"; }
};
int main()
{
derivada1 obj1;
derivada2 obj2;
obj1.set(2, 3);
obj1.mostrar();
obj1.setk();
obj1.mostrark();
obj2.set(3, 4);
obj2.mostrar();
obj2.setk();
obj2.setm();
obj2.mostrark();
obj2.mostrarm();
return 0;
}
class base class derivada1 : public base class derivada2 : public derivada1
void mostrar()
Actividad 4
#include <iostream>
#include <cstring>
using namespace std; 1. Cuantos métodos tiene la clase
2. Cuantos constructores tiene la clase
class cadena 3. Cuantos destructores tiene la clase
{
public: Explique a grades rasgos lo que hace el programa
cadena(); // Constructor por defecto
cadena(const char *c); // Constructor desde cadena c
cadena(int n); // Constructor de cadena de n caracteres
cadena(const cadena &); // Constructor copia
~cadena(); // Destructor
cadena::cadena(int n)
{
cad = new char[n+1]; // Reserva memoria para n
caracteres
cad[0] = 0; // Cadena vacía
}
cadena::~cadena()
{
delete[] cad; // Libera la memoria reservada a
cad
}
// Modificamos Cadena1:
Cadena1.Asignar("Otra cadena diferente");
// Creamos Cadena3:
Cadena3 = new cadena("Cadena de prueba 3");
// Ver resultados
cout << "Cadena 1: " << Cadena1.Leer(c) << endl;
cout << "Cadena 2: " << Cadena2.Leer(c) << endl;
cout << "Cadena 3: " << Cadena3->Leer(c) << endl;
return 0;
}
Actividad 5
Conclusiones
Actividad 5
Liga contenido
https://docs.microsoft.com/en-us/cpp/cpp/constructors-cpp?view=vs-2019
C Con Clase | Curso C++ (cap30)
http://informatica.utem.cl/~mcast/ESDATOS/RESPALDO/POO-C++-IV-2.ppt