C/Visual C - Funciones Virtuales

 
Vista:

Funciones Virtuales

Publicado por Oliver++ (339 intervenciones) el 14/11/2002 15:25:30
escribo el sig. codigo y el compilador no genera error y todo funciona como si definiera las funciones virtuales.

class Cbase
{ public:
int funcion()
{
return 1;
}
};

class Cderivada : public Cbase
{ public:
int funcion()
{
return 2;
}
};

He leido que las funciones virtuales se definen para decirle al compilador que habra una nueva version de la misma en una o todas las clases derivadas pero yo la redefino sin declararla virtual y no me presenta problemas. Al instanciar los objetos todo funciona perfecto.

Cbase clasebase;
clasebase.funcion() // me devuelve 1
Cderivada clasederivada;
clasederivada.funcion() // me devuelve2

Yo he llegado a la conclucion de que el compilador asume que son virtuales. Me podrias abundar sobre el tema
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Funciones Virtuales

Publicado por Alvaro (122 intervenciones) el 14/11/2002 18:19:24
Ese no es el caso.
Lo que has hecho es simplemente sobrecargar la funcion.
en la clase base y derivada existen dos formas distintas de funcion.
Las funciones virtuales tienen otro significado.
prueba lo siguiente y me sices que pasa:
class base {
virtual int function() { return 1; };
}

clase derived : pruble base {
int function() { return 2; };
}

luego en alguna parte:
base b, *pb;
derived d;
pb = &b;
pb->function(); //Que te retorna esto.
pb = &d;
pb->function(); // y ahora que te retorna.

SUERTE...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Funciones Virtuales

Publicado por danisss (6 intervenciones) el 16/11/2002 16:05:34
Eso es. La función de las funciones virtuales es funcionar con polimorfismo. Con un puntero a la clase base, haces funcionar las funciones iimplementadas en los hijos.

Suerte!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Funciones Virtuales

Publicado por Oliver++ (339 intervenciones) el 16/11/2002 18:38:30
y cual es la diferencia entonces si funciona igual.?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Funciones Virtuales

Publicado por El Mogur (202 intervenciones) el 18/11/2002 15:35:00
La diferencia se da cuando utilizas punteros.
En tu ejemplo, se tienen dos funciones: Cbase::funcion() y Cderivada::funcion().

Cuando tienes una variable de Cbase, se llamará siempre a la función de Cbase, y cuando tienes una variable del tipo Cderivada, se llamará a la derivada:

Cbase base;
Cderivada derivada;

base.funcion(); // Llama a Cbase::funcion()
derivada.funcion(); // Llama a Cderivada::funcion()

Sin embargo, si tienes variables _puntero_ a objetos de esa clase:

Cbase *base;
Cderivada *derivada;

derivada->funcion(); // Llama a Cderivada::funcion()
base->funcion(); // Depende del objeto al que apunte, llama a una u otra.

En este último caso, si base apunta a un objeto de Cbase, se llama a Cbase::funcion(), mientras que si apunta a un objeto de Cderivada, se llama a Cderivada::funcion(), a pesar de que la variable es en realidad un puntero a Cbase. Sin embargo, si la función no es virtual, base->funcion() llamara siempre a Cbase::funcion().

Espero que te sirva.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar