13.01.2015 Views

Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO

SHOW MORE
SHOW LESS

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 />

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!