Duda c++ - enlace dinámico

bLero

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).
r2d2rigo

No estas haciendo override de toString en la clase hija, por lo que hay shadowing de la funcion y llama al de la clase base. Marca el toString de Employee como virtual tambien y deberia irte.

1 respuesta
bLero

#2

que yo sepa, solo hace falta declarar virtual en la clase base.

He probado y nada, sigue igual :(

1 respuesta
r2d2rigo

#3 pues entonces me da a mi que como no declares la base virtual pura (abstracta) no te va a chutar entonces.

1 respuesta
bLero

#4 pero si declaro la clase virtual pura, entonces no puedo crear instancias de User.

Tiene que poderse, falla algo...

bLero

Solucionado:

Autocitandome: "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"

Efectivamente, si creo dinámicamente un array de Users, y no de referencias o punteros a Users, lo único que puede contener dicho array son Users y no Employees por lo que se carga el polimorfismo.

1

Usuarios habituales

  • bLero
  • r2d2rigo