Foros del Web » Programación para mayores de 30 ;) » C/C++ »

TYPEID y HERENCIA

Estas en el tema de TYPEID y HERENCIA en el foro de C/C++ en Foros del Web. Sigo con problemas a la hora de usar el typeid: Tengo una clase A Tengo una clase B que hereda de A Tengo un array ...
  #1 (permalink)  
Antiguo 09/06/2008, 07:54
 
Fecha de Ingreso: mayo-2008
Mensajes: 3
Antigüedad: 16 años, 5 meses
Puntos: 0
Información TYPEID y HERENCIA

Sigo con problemas a la hora de usar el typeid:
Tengo una clase A
Tengo una clase B que hereda de A
Tengo un array de tipo A donde guardo objetos A y B
Problema:
con un ciclo for recorro este array en busca de los objetos de tipo B para ello uso el operador TYPEID pero me da como resultado que reconoce a todos los objetos dentro de este array como clase A. Cosa que me impide hecer lo que deseo.
Ya se que teoricamente debe funcionar, pero sencillamente no lo haxe, he buscado por todos lados y lo mas que he encontrado es una referencia a RTTI (run time.....)
si alguien me diera un norte se lo agradeceria
  #2 (permalink)  
Antiguo 09/06/2008, 14:24
 
Fecha de Ingreso: abril-2008
Mensajes: 264
Antigüedad: 16 años, 7 meses
Puntos: 2
Respuesta: TYPEID y HERENCIA

Te hago una recomendación, puesto que no conozco de typeId ni c++, pero se más de objetos y cosas que pueden ser útiles independientemente del lenguaje.

seguramente lo que tu queres hacer es algo así (en pseudocódigo):

Código:
for (int i=0; i<array.length() ; i++){
  if (array[i].isB()){
    array[i].hacerAlgo();
  }
}

El problema que tienes es tienes dos objetos que no son polimorficos (porque los dos no hacenAlgo()) y los tienes juntos en un mismo array.

solucion 1) Ponlos en arrays separados.
solucion 2) en vez de usar el typeId, declara métodos isA isB por los que puedas preguntar.
solucion 3) (esta es la que mas me gusta) haz que los objetos A y los objetos B tengan el método hacerAlgo() pero los objetos A no hagan nada :), por lo que tu código quedaría como:

Código:
for (int i=0; i<array.length() ; i++){
    array[i].hacerAlgo();
}
Y no tienes que preguntar por el tipo

Suerte, espero que te sirva!
__________________
Saludoss
Guille
  #3 (permalink)  
Antiguo 09/06/2008, 16:38
 
Fecha de Ingreso: septiembre-2003
Mensajes: 20
Antigüedad: 21 años, 2 meses
Puntos: 2
Pregunta Respuesta: TYPEID y HERENCIA

Hola, no soy bueno explicando.

Lo que sucede es que en c++ las funciones no son virtuales por defecto asi que si tu quieres usar el metodo B sobre la clase A

Ejemplo:

A* b = new B()
b->print() // print debe ser virtual en A si no se usa el print A

asi que supongo lo que te falta es declarar el metodo virtual

bueno aqui van unos ejemplos

sin virtual
Código:
#include <iostream>

using namespace std;

class A
{
public:
	void print()
	{
		cout << "A" << endl;
	}
};

class B : public A
{
public:
	void print()
	{
		cout << "B" << endl;
	}
};

int main()
{
	A* b[4];
	b[0] = &A();
	b[1] = &A();
	b[2] = &B();
	b[3] = &B();

	for(int i = 0; i < 4; i++)
	{
		cout << typeid(*b[i]).name() << endl;
		b[i]->print();
	}

	return 0;
}
con virtual
Código:
#include <iostream>

using namespace std;

class A
{
public:
	virtual void print()
	{
		cout << "A" << endl;
	}
};

class B : public A
{
public:
	void print()
	{
		cout << "B" << endl;
	}
};

int main()
{
	A* b[4];
	b[0] = &A();
	b[1] = &A();
	b[2] = &B();
	b[3] = &B();

	for(int i = 0; i < 4; i++)
	{
		cout << typeid(*b[i]).name() << endl;
		b[i]->print();
	}

	return 0;
}
te recomiendo que uses una interface
Código:
#include <iostream>

using namespace std;

class I
{
public:
	virtual void print() = 0;
};

class A : public I
{
public:
	void print()
	{
		cout << "A" << endl;
	}
};

class B : public I
{
public:
	void print()
	{
		cout << "B" << endl;
	}
};

int main()
{
	I* b[4];
	b[0] = &A();
	b[1] = &A();
	b[2] = &B();
	b[3] = &B();

	for(int i = 0; i < 4; i++)
	{
		cout << typeid(*b[i]).name() << endl;
		b[i]->print();
	}

	return 0;
}
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:50.