Hola MVCoders,
Hace mucho que no miro nada de c++, y hoy que me he puesto a hacer una tontería he encontrado un problema que no consigo resolver, aver si vosotros podéis abrirme los ojos.
Tengo una clase base User, con un atributo "name" y un método "toString()":
class User
{
protected:
string name;
public:
User(){}
User(string name) { this->name = name; }
virtual string toString() const { return name; }
};
Tengo otra clase derivada de la anterior "Employee" que además incluye un atributo "id" y sobrecarga el método "toString()" de la clase base:
class Employee : public User
{
private:
string id;
public:
Employee(string name, string id) : User(name) { this->id = id;}
string toString() const { return "("+id+")"+name; }
};
Bien, ahora tengo una clase Stack (Pila), con un array de Users (OJO: de objetos, no de referencias a objetos).
class Stack
{
private:
User *stack;
int sp;
int size;
public:
Stack(int size){this->size = size; stack = new User[size]; sp = 0;}
.
.
.
El problema está en que:
Stack s(10);
Employee e1("pepito", "1234");
cout << e1.toString(); // IMPRIME (1234)pepito -> CORRECTO
s.push(e1);
cout << s.pop().toString(); // IMPRIME pepito -> INCORRECTO (utiliza el toString de la clase base).
He pensado en que algún error podría estar en:
- Almacenar objetos y no referencias a objetos y que por eso no funcione el enlace dinámico :S
- En la línea stack = new User[size], se llama al constructor por defecto de User (que tuve que definir explícitamente, y nose es correcto hacer eso).