Herencia Avanzada c++

Páginas: 14 (3307 palabras) Publicado: 16 de julio de 2015
Informática II
Clase 10: Otros tipos de herencia

1

CONTENIDO
1

Herencia Multiple

2

Herencia Virtual

3

Clases Abstractas

4

Contención y Delegación

5

Herencia Avanzada

2

HERENCIA MÚLTIPLE
• C++ permite crear clases derivadas que
heredan los miembros de una o más
clases antecesoras.
Esta es una característica en la que C++
difiere de otros lenguajes.
Esta característica tiene pros ycontras.

• La herencia múltiple:
Consiste en el ensamblando una nueva clase
con los elementos de varias clases-base.

3

HERENCIA MÚLTIPLE
• Cuando se desea declarar una clase derivada de varias
clases base se utiliza una lista de las bases directas
separadas por comas, es decir:
class Clase_Derivada :
tipoDeAcceso ClaseBase1,
tipoDeAcceso ClaseBase2,…{
};
• Clase_Derivada hereda todos losmiembros de las clases
antecesoras
 ClaseBase1, ClaseBase2, …
 Usando herencia pública sólo puede utilizar los miembros que
derivan de recursos públicos y protegidos en las clases base.
4

Herencia Múltiple
class ClaseA {
public:
ClaseA() : valorA(10) {}
int getValor() const {
return valorA;
}
protected:
int valorA;
};
class ClaseB {
public:
ClaseB() : valorB(20) {}
int LeerValor() const {
returnvalorB;
}
private:
int valorB;
};

#include
using namespace std;
class ClaseC : public ClaseA, public ClaseB {};
int main() {
ClaseC CC;
// Que valores se imprimen?
cout << CC.LeerValor() << endl;
cout << CC.getValor() << endl;
cout << CC.valorA << endl;
cout << CC.valorB << endl;
return 0;
}

5

HERENCIA MÚLTIPLE
class ClaseA {
public:
ClaseA() : valorA(10) {}
ClaseA(int va) :valorA(va) {}
int getValor() const {
return valorA;
}
protected:
int valorA;
};

#include
using namespace std;
class ClaseC : public ClaseA, public ClaseB {
ClaseC(int va, int vb) : ClaseA(va),
ClaseB(vb) { }
};
int main() {
ClaseC CC(13,26);

class ClaseB {
public:
ClaseB() : valorB(20) {}
ClaseB(int vb) : valorB(vb) {}
int LeerValor() const {
return valorB;
}
protected:
}
int valorB;
};

cout<< CC.LeerValor() << endl;
cout << CC.getValor() << endl;
cout << CC.valorA << endl;
cout << CC.valorB << endl;
return 0;

6

AMBIGÜEDADES
• La herencia múltiple puede originar situaciones
de ambigüedad
 Cuando una clase derivada contiene versiones
duplicadas de clases base o cuando clases bases
contienen atributos del mismo nombre.

• El problema de la ambigüedad puede ser
resuelto si:
 Seespecifica a cual de las clases bases pertenece la
propiedad heredada.
 Se re-define el método en la clase derivada

7

AMBIGÜEDADES
“La herencia múltiple es uno de los puntos peliagudos del lenguaje C++.
Hasta el extremo que algunos teóricos consideran que esta característica
debe evitarse, ya que además de los problemas teóricos, presenta
también una gran dificultad técnica para su implementaciónen los
compiladores.
Por ejemplo, surge la cuestión: si dos clases A y B son clases base
de una subclase D, y ambas tienen propiedades con
el mismo nombre, ¿Que debe resultar en la subclase D? ¿Miembros
Duplicados?, o ¿un miembro que sean la agregación de las propiedades
de A y B?.
Los creadores del C++ optaron por un diseño que despeja cualquier
posible ambigüedad, aunque ciertamente deriva enuna serie de reglas
y condiciones bastante intrincadas”

8

AMBIGÜEDADES: SOLUCIÓN 1
class ClaseA {
public:
ClaseA() : valorA(10) {}
int LeerValor() const {
return valorA;
}
protected:
int valorA;
};
class ClaseB {
public:
ClaseB() : valorB(20) {}
int LeerValor() const {
return valorB;
}
protected:
int valorB;
};

#include
using namespace std;
Método
Método
class ClaseC : public ClaseA,public ClaseB {};
Derivado de
derivado de
int main() {
ClaseA??
ClaseB??
ClaseC CC;
// Produce error de compilación por ambigüedad
cout << CC.LeerValor() << endl;
return 0;
#include
}using namespace std;
class ClaseC : public ClaseA, public ClaseB {};
int main() {
ClaseC CC;
// Manera correcta de hacerlo
cout << CC.ClaseA::LeerValor() << endl;
cout << CC.ClaseB::LeerValor() << endl;...
Leer documento completo

Regístrate para leer el documento completo.

Estos documentos también te pueden resultar útiles

  • Herencia en c++
  • Herencia en C#
  • Herencia en c++
  • Métodos avanzados herencia (informática) ...
  • Herencia y polimorfismo en c++
  • Ejercicios Herencia C#
  • Ejemplo herencia c++
  • C Ncer Herencia Y Ambiente

Conviértase en miembro formal de Buenas Tareas

INSCRÍBETE - ES GRATIS