Clases, Herencia y funciones Virtuales Puras

Tengo una pregunta o duda que hace rato nadie me puede contestar.
Estoy haciendo un trabajo para algoritmos 1 y tengo una duda, tengo por ejemplo una clase base "clase1" y tengo en el public una función virtual "funcion1(int variable)"
Ahora en una de las clases hijas (concretas) "clasehija1" la función "funcion1" ya no es virtual pero necesito pasarle otra variable como parámetro "funcion1(int variable, char carácter)"
Osea:
Código:
//clase1.h
...
class clase1{
public:
clase1();
~clase1();
virtual funcion1(int variable)=0;
};
//clasehija1.h
...
class clasehija1 : public clase1{
public:
clasehija1();
~clasehija1();
funcion1(int variable, char caracter);
};
¿La duda seria como hago en el cpp de "clasehija1" con la "funcion1"?
Tendría que poner las dos funciones "funcion1(int variable)" y "funcion1(int variable, char carácter)" para que ande... Pero no se como.
Osea tendría una sobrecarga de operadores(?) En la función "funcion1"
Pero no se como implementar en "clasehija1.cpp" la "funcion1" ya que tiene distintos parámetros en "clase1" y "clasehija1" .
¿Se entiende?

2 Respuestas

Respuesta
1
class clase1{
public:
clase1();
~clase1();
virtual funcion1(int variable)=0;
};
//clasehija1.h
...
class clasehija1 : public clase1{
public:
clasehija1();
~clasehija1();
funcion1(int variable, char caracter);
virtual funcion1(int variable);
};
clasehija1::funcion1(int variable)
{
//aca el codigo
}
clasehija1::funcion1(int variable, char caracter)
{
//aca el codigo
}
//La funcion1 con dos parámetros en la clase madre es desconocida! (Porque no esta declarada)
entonces:
se puede hacer:
clasehija1 *obj= new clasehija1;
obj->funcion1(123);
obj->funcion1(123,'a');
// pero:
clase1 *obj= new clasehija1; //esta ok!!
obj->funcion1(123); //esta ok!!
Obj->funcion1(123,'a'); //ERROR!!! esta función es desconocidad para la 'clase1'
En c++ una función con distintos parámetros, ya sea por cantidad de parámetros o tipo de ellos, son funciones totalmente diferentes.
En el caso exacto que me pasas hay varios errores:
1) Las fucniones tiene que especificar el valor de retorno.
funcion1(int variable, char caracter);
esta mal, debe ser:
int funcion1(int variable, char caracter);
O el tipo que retorne la función y si no retorna nada debe er 'void'.
2) Como la clase1 declara a funcion1 virtual pura (por el =0) la clase hija debe definir esta porque sino no podrá ser instanciada. (Instanciar: significa definir un objeto del tipo 'clasehija1').
Respuesta
1
A tu pregunta sobre si se entiende tu pregunta la respuesta es no. jajajajja
Tienes todo un poco liado, así que casi que t explico todo.
1º - sobrecarga
Imaginate que tengo una clase así:
class CBase
{
// ...
void funcion1(int);
void funcion1(int,char);
//funcion1 es funcion sobrecargada
}
Para que una función se considere sobrecargada ha de tener mismo nombre y distinto numero de parámetros. Si una función sobrecargada se diferencia unicamente en el valor devuelto dará error de compilación
class CBase
{
// ...
void funcion(int);
int funcion(int); //error
}
2º herencia y funciones virtuales
Al heredar una clase, si en la clase base tenemos una función virtual, en la clase derivada no hace falta definirla como virtual para que lo sea.
Si en la clase derivada creamos una función con el mismo nombre, pero con distinto numero de parámetros, esta no sera virtual. Esto es:
class CBase
{
// ...
virtual void funcion1(int);
//funcion1 es funcion virtual
}
class CDerivada:public CBase
{
// ...
void funcion1(int);
void funcion1(int,char);
//la primera funcion1 es virtual
//la segunda no
}
Si la funcion funcion1(int,char) kiero q sea virtual hay 2 opciones:
* 1
class CBase
{
// ...
virtual void funcion1(int);
//funcion1 es funcion virtual
}
class CDerivada:public CBase
{
// ...
void funcion1(int);
virtual void funcion1(int,char);
}
* 2
class CBase
{
// ...
virtual void funcion1(int);
virtual void funcion1(int,char);
//funcion1 es funcion virtual
}
class CDerivada:public CBase
{
// ...
void funcion1(int);
void funcion1(int,char);
}
No se si ha quedado muy claro, espero que si. De todas formas aquí m tienes para cualquier otr aclaración

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas