Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
✐<br />
✐<br />
✐<br />
“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 421 — #459<br />
✐<br />
14.5. Funciones que no heredan automáticam<strong>en</strong>te<br />
m<strong>en</strong>te que lo conti<strong>en</strong>e. Esto es un tema muy importante que será explorado al final<br />
de este capitulo y el sigui<strong>en</strong>te.<br />
Her<strong>en</strong>cia privada<br />
Puede heredar utilizando una clase base de forma privada borrando public <strong>en</strong><br />
la lista de la clase base o explícitam<strong>en</strong>te utilizando private (definitivam<strong>en</strong>te la mejor<br />
política a tomar pues indica al usuario lo que desea hacer). Cuando se hereda de forma<br />
privada, esta "implem<strong>en</strong>tado <strong>en</strong> términos de", esto es, se esta creando una nueva<br />
clase que ti<strong>en</strong>e todos los datos y funcionalidad de la clase base, pero la funcionalidad<br />
esta oculta, solo una parte de capa de implem<strong>en</strong>tación. La clase derivada no ti<strong>en</strong>e acceso<br />
a la capa de funcionalidad y un objeto no puede ser creado como instancia de<br />
la clase base (como ocurrió <strong>en</strong> FName2.cpp).<br />
Se sorpr<strong>en</strong>derá del propósito de la her<strong>en</strong>cia privada, porque la alternativa, usar<br />
la composición para crear un objeto privado <strong>en</strong> la nueva clase parece más apropiada.<br />
La her<strong>en</strong>cia privada esta incluida para completar el l<strong>en</strong>guaje pero para reducir<br />
confusión, normalm<strong>en</strong>te se usará la composición <strong>en</strong> vez de la her<strong>en</strong>cia privada. Sin<br />
embargo, exist<strong>en</strong> ocasiones donde se desea el mismo interfaz como la clase base y<br />
anular tratami<strong>en</strong>to del objeto. La her<strong>en</strong>cia privada proporciona esta habilidad.<br />
14.5.2.2.1. Publicar los miembros heredados de forma privada Cuando se hereda<br />
de forma privada, todos los miembros públicos de la clase base llegan como<br />
privados. Si desea que cualquiera de ellos sea visible, solo use sus nombres (sin argum<strong>en</strong>tos<br />
o valores de retorno) junto con la palabra clave using <strong>en</strong> una sección pública<br />
de la clase derivada:<br />
//: C14:PrivateInheritance.cpp<br />
class Pet {<br />
public:<br />
char eat() const { return ’a’; }<br />
int speak() const { return 2; }<br />
float sleep() const { return 3.0; }<br />
float sleep(int) const { return 4.0; }<br />
};<br />
class Goldfish : Pet { // Private inheritance<br />
public:<br />
using Pet::eat; // Name publicizes member<br />
using Pet::sleep; // Both members exposed<br />
};<br />
int main() {<br />
Goldfish bob;<br />
bob.eat();<br />
bob.sleep();<br />
bob.sleep(1);<br />
//! bob.speak();// Error: private member function<br />
} ///:~<br />
Así, la her<strong>en</strong>cia privada es útil si desea esconder parte de la funcionalidad de la<br />
clase base.<br />
Fíjese que si expone el nombre de una función sobrecargada, expone todas las<br />
versiones sobrecargadas de la función <strong>en</strong> la clase base.<br />
421<br />
✐<br />
✐<br />
✐<br />
✐