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

Ayuda con Polimorfismo!

Estas en el tema de Ayuda con Polimorfismo! en el foro de C/C++ en Foros del Web. Disculpen que este haciendo tantas preguntas pero sinceramente no se que mas hacer, e leido en paginas y no encuentro solucion. Mi problema se encuentra ...
  #1 (permalink)  
Antiguo 15/09/2007, 02:07
 
Fecha de Ingreso: agosto-2007
Mensajes: 6
Antigüedad: 17 años, 4 meses
Puntos: 0
Ayuda con Polimorfismo!

Disculpen que este haciendo tantas preguntas pero sinceramente no se que mas hacer, e leido en paginas y no encuentro solucion.
Mi problema se encuentra en una declaracion similar a esta es:, utilizo dev-c++

NombreClaseBase *base;
if(variable==1){
NombreClaseDerivada1 clase1;
base=&clase1;
}
if(variable==2){
NombreClaseDerivada2 clase2;
base=&clase2;
}
base->getAlgo();
base->calcularAlgo();


basicamente eso intento hacer.. que dependiendo de que seleccione d variable si 1 o 2 llame a una clase, pero esto me tira el siguiente error:

C:\Dev-Cpp\Proyecto\main.cpp 'class NombreClaseBase' has no member named 'getAlgo'
C:\Dev-Cpp\Proyecto\main.cpp 'class NombreClaseBase' has no member named 'calcularAlgo'

mi pregunta es: ¿Esto sucede porque no se puede llamar asi a una clase derivada? si es asi, como podria llamarse a una clase derivada aplicando polimorfismo, si no es por esto ¿que lo esta causando?

Gracias por su atencion al leer esto, espero una respuesta lo mas rapido posible y disculpen las molestias.
  #2 (permalink)  
Antiguo 15/09/2007, 08:43
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 22 años, 1 mes
Puntos: 52
Re: Ayuda con Polimorfismo!

No se como estes declarando la clase.
Pero se supone que si quieres llamar a los metodos de la clase derivada asi, tienes que declarar los metodos en la clase principal. Y pues se supone deben ser viruales, pero eso ya depende de que es lo que estes haciendo.

Saludos
  #3 (permalink)  
Antiguo 15/09/2007, 12:37
 
Fecha de Ingreso: agosto-2007
Mensajes: 6
Antigüedad: 17 años, 4 meses
Puntos: 0
Re: Ayuda con Polimorfismo!

la clase derivada se declara asi:

#ifndef NOMBRECLASEDERIVADA_H
#define NOMBRECLASEDERIVADA_H
#include "NombreClaseBase.h"
class NombreClaseDerivada : public NombreClaseBase{

public:
NombreClaseDerivada(int =7);
void calcularAlgo();
int getAlgo();
private:
int algo;
};

#endif


y el .cpp seria:

#include "NombreClaseDerivada.h"
NombreClaseDerivada::NombreClaseDerivada(int variable):NombreClaseBase(tam){
algo=0;
}

void NombreClaseDerivada::calcularAlgo(){
algo+=getTam()*50-getError()*20;
if(getBono()!=0){
algo+=200;
}

int NombreClaseDerivada:: getAlgo(){
return algo;
}


Los metodos getBono(),getTam() y getError() son de la clase base, no se supone que virtual solo es cuando en la clase padre e hijo hay funciones denominadas igual, y la variable sobrepone la de la funcion padre, para evitar que haga eso es que entiendo que funciona el virtual, no estoy muy seguro..
  #4 (permalink)  
Antiguo 22/09/2007, 13:31
Avatar de caerolus  
Fecha de Ingreso: agosto-2004
Ubicación: Madrid, España
Mensajes: 280
Antigüedad: 20 años, 4 meses
Puntos: 1
Re: Ayuda con Polimorfismo!

Tienes un claro problema de concepto aquí. Si defines la variable base como objeto de tipo ClaseBase, lo único que vas a poder hacer con ella es lo que declares en ClaseBase y en sus clases padres (si las tuviera). Precisamente, por ser la clase base, no puedes invocar métodos que defines en las clases derivadas, porque la clase base no sabe nada de lo que declaran sus clases derivadas.
Así que si quieres llamar a métodos de las clases derivadas, tu variable ha de ser de tipo ClaseDerivada, así que o haces un casting desde la variable base (no recomendable porque es propenso a errores), o desde el principio usas una variable derivada. En tu caso, no tiene sentido usar una variable base.
Recuerda: una variable es tratada como su tipo y el de sus padres, pero nunca como el de sus hijas.
__________________
Mi página personal: Julián Urbano
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 18:20.