Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
✐<br />
✐<br />
✐<br />
“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 467 — #505<br />
✐<br />
15.10. funciones virtuales y constructores<br />
bre debido a que la clase raiz de la jerarquía suele ser llamada "Objeto". Además, el<br />
usar jerarquía de raiz única, ti<strong>en</strong>e como resultado otros b<strong>en</strong>eficios: de hecho, cualquier<br />
otro l<strong>en</strong>guaje ori<strong>en</strong>tado a objetos que no sea el <strong>C++</strong> obliga a usar una jerarquía<br />
- cuando se crea una clase se hereda automáticam<strong>en</strong>te de forma directa o indirecta de<br />
una clase base común, una clase base que fue establecida por los creadores del l<strong>en</strong>guaje.<br />
En <strong>C++</strong>, se p<strong>en</strong>so que forzar a t<strong>en</strong>er una base clase común crearía demasiada<br />
sobrecarga, por lo que se desestimó. Sin embargo, se puede elegir usar <strong>en</strong> nuestros<br />
proyectos una clase base común, y esta materia será tratada <strong>en</strong> el segundo volum<strong>en</strong><br />
de este libro.<br />
Para solucionar el problema de pert<strong>en</strong><strong>en</strong>cia, se puede crear una clase base Object<br />
extremadam<strong>en</strong>te simple, que sólo ti<strong>en</strong>e un destructor virtual. De esta forma<br />
Stack puede manejar objetos que hered<strong>en</strong> de Object:<br />
//: C15:OStack.h<br />
// Using a singly-rooted hierarchy<br />
#ifndef OSTACK_H<br />
#define OSTACK_H<br />
class Object {<br />
public:<br />
virtual ~Object() = 0;<br />
};<br />
// Required definition:<br />
inline Object::~Object() {}<br />
class Stack {<br />
struct Link {<br />
Object* data;<br />
Link* next;<br />
Link(Object* dat, Link* nxt) :<br />
data(dat), next(nxt) {}<br />
}* head;<br />
public:<br />
Stack() : head(0) {}<br />
~Stack(){<br />
while(head)<br />
delete pop();<br />
}<br />
void push(Object* dat) {<br />
head = new Link(dat, head);<br />
}<br />
Object* peek() const {<br />
return head head->data : 0;<br />
}<br />
Object* pop() {<br />
if(head == 0) return 0;<br />
Object* result = head->data;<br />
Link* oldHead = head;<br />
head = head->next;<br />
delete oldHead;<br />
return result;<br />
}<br />
};<br />
#<strong>en</strong>dif // OSTACK_H ///:~<br />
467<br />
✐<br />
✐<br />
✐<br />
✐