• Jueves 16 de Mayo de 2024, 21:13

Autor Tema:  Clases Abstractas Y Herencia  (Leído 2193 veces)

bob esponja

  • Miembro MUY activo
  • ***
  • Mensajes: 411
    • Ver Perfil
    • http://marianoguerra.blogspot.com
Clases Abstractas Y Herencia
« en: Jueves 27 de Mayo de 2004, 02:57 »
0
buenas programo en C y java y me meti en la orientacion a objetos de C (C++)
yb tengo un problema:

quiero crear una clase base abstracta con variables y metodos (abstractos).
luuego heredar dos clases de esa.

como se crea una clase abstracta?
como se crean los metodos abstractos?
se pueden definir variables en una clase abstracta?

se programar orientado a objetos pero nunca hice herencia con clases abstractas ese en mi problema.

QliX=D!

  • Miembro MUY activo
  • ***
  • Mensajes: 214
    • Ver Perfil
Re: Clases Abstractas Y Herencia
« Respuesta #1 en: Jueves 27 de Mayo de 2004, 04:37 »
0
Bueno para eso debes declarar todos los metodos como virtuales puros:

Código: Text
  1.  
  2. class baseabstracta
  3. {
  4.   public: //Los metodos no tienen por que ser publicos es solo un ejemplo.
  5.     virtual void metodo1(/*parametros*/) = 0; //con =0 es Virtual PURA
  6. }
  7.  
  8.  

Y asi con cada metodo luego al heredar debes implementar todos los metodos (aunque sea sin codigo) para que se pueda instanciar los objetos de esa clase.

Para heredar de cualquier clase:

Código: Text
  1.  
  2. class heredada : baseabstracta
  3. {
  4.   public: //No tiene por que ser publico el metodo de la clase base implementada.
  5.     void metodo1(/*Parametros*/){
  6.         //codigo...
  7.     }
  8. }
  9.  
  10.  

Bueno espero que lo entiendas.
Saludos.
QliX=D! - From the top of Tsunami

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Clases Abstractas Y Herencia
« Respuesta #2 en: Jueves 27 de Mayo de 2004, 12:41 »
0
Hola.

Esa explicación parece más la de un interfaz. La idea de la clase abstracta es que no puedas crear instancias, pero no tienes por qué carecer de la posibilidad de implementar los métodos. Yo lo que haría sería hacer virtual sólo el destructor (según leí en Thinking in C++).

Un saludo.

Ruben3d

nicokiki

  • Miembro MUY activo
  • ***
  • Mensajes: 298
    • Ver Perfil
Re: Clases Abstractas Y Herencia
« Respuesta #3 en: Jueves 27 de Mayo de 2004, 15:07 »
0
Hola!!!!!

El destructor debe ser virtual siempre q tengas herencia (publica, protegida, privada, virtual) para q se liberen todos los objetos de una forma correcta.
Con el tema, de los metodos virtuales, coincido con Qlix=D! .

Salu2!!!!!

QliX=D!

  • Miembro MUY activo
  • ***
  • Mensajes: 214
    • Ver Perfil
Re: Clases Abstractas Y Herencia
« Respuesta #4 en: Jueves 27 de Mayo de 2004, 15:53 »
0
En realidad Ni.

Veamos...
En principio una clase base abstracta es una clase base que tiene (en general todas pero "por definicion") al menos un metodo Abstracto puro.
Si tiene TODOS los metodos abstractos puros es una interfaz.
Si NO tiene Ningun metodo abstracto puro, no es abstracta, si no que es una clase que usa para esos metodos un late-binding, para permitir la especializacion del metodo en las clases hijas.

Con respecto a los destructores virtuales son utiles solo en caso de que pretendas utilizar a tus clases hijas en base a un puntero de la clase padre:

Base *Puntero = new ClaseHija();


Si ClaseHija no tiene su destructor declarado como virtual (no virtual puro!, OJO) entonces nunca se llama al destructor de la clase padre.

Saludillos gente.

Excelente libro el de Eckel :D
QliX=D! - From the top of Tsunami

QliX=D!

  • Miembro MUY activo
  • ***
  • Mensajes: 214
    • Ver Perfil
Re: Clases Abstractas Y Herencia
« Respuesta #5 en: Jueves 27 de Mayo de 2004, 15:56 »
0
Ah!, y me olvidaba, Ruben3D se ve que entendiste mal lo que leiste del libro... eso de que si delcaras el destructor virtual la clase es abstracta no es asi.
Fijate bien, relee esa parte asi se te quitan las dudas.

Saludos :D :blink:
QliX=D! - From the top of Tsunami

nicokiki

  • Miembro MUY activo
  • ***
  • Mensajes: 298
    • Ver Perfil
Re: Clases Abstractas Y Herencia
« Respuesta #6 en: Jueves 27 de Mayo de 2004, 16:35 »
0
Qlix=D! : tenes razon en lo q decis. Yo deberia haber explicado lo q pusiste sobre los destructores virtuales y re-coincido con vos q el hecho de tener destructores virtuales no implica clases abstractas.


Salu2!!!!!!

The Black Boy

  • Miembro de PLATA
  • *****
  • Mensajes: 1043
  • Nacionalidad: co
    • Ver Perfil
    • http://www.mslatam.com/latam/technet/mva2/Microsite.aspx?alias=JairoDiaz
Re: Clases Abstractas Y Herencia
« Respuesta #7 en: Jueves 27 de Mayo de 2004, 16:37 »
0
Interesante lo que han mencionado... y deacuerdo con la 1ra solucion de Qlix para la pregunta en cuestion...


Citar
Ah!, y me olvidaba, Ruben3D se ve que entendiste mal lo que leiste del libro... eso de que si delcaras el destructor virtual la clase es abstracta no es asi.
Fijate bien, relee esa parte asi se te quitan las dudas.

pero eso no fue lo que quizo decir Ruben3d... o bueno eso no es lo que yo interpreto..

Saludos :hola:
El inteligente no es aquel que lo sabe todo
sino aquel que   sabe utilizar lo poco que sabe.


Espacio Personal

si necesitas algo de programacion click aqui, si no esta aqui no existe

Programacion]

The Black Boy

  • Miembro de PLATA
  • *****
  • Mensajes: 1043
  • Nacionalidad: co
    • Ver Perfil
    • http://www.mslatam.com/latam/technet/mva2/Microsite.aspx?alias=JairoDiaz
Re: Clases Abstractas Y Herencia
« Respuesta #8 en: Jueves 27 de Mayo de 2004, 16:39 »
0
Qlix=D! que bueno tenerte por el foro de nuevo... tenias mucho tiempo de no entrar
El inteligente no es aquel que lo sabe todo
sino aquel que   sabe utilizar lo poco que sabe.


Espacio Personal

si necesitas algo de programacion click aqui, si no esta aqui no existe

Programacion]

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Clases Abstractas Y Herencia
« Respuesta #9 en: Jueves 27 de Mayo de 2004, 20:59 »
0
Buenas.

Cita de: "nicokiki"
El destructor debe ser virtual siempre q tengas herencia (publica, protegida, privada, virtual) para q se liberen todos los objetos de una forma correcta.

Sólo si usas polimorfismo.

Cita de: "Qlix=D!"
eso de que si delcaras el destructor virtual la clase es abstracta no es asi

Cierto. Donde me referí a 'destructor virtual' debería haber dicho 'destructor virtual puro'.

Cita de: "Qlix=D!"
Si tiene TODOS los metodos abstractos puros es una interfaz.
Si NO tiene Ningun metodo abstracto puro, no es abstracta
Cita de: "Ruben3d"
Esa explicación parece más la de un interfaz. La idea de la clase abstracta es que no puedas crear instancias, pero no tienes por qué carecer de la posibilidad de implementar los métodos.

Lo mismo hemos dicho, solo que, como he dicho justo arriba, me ha faltado la palabra 'puro'.

Cita de: "Qlix=D!"
Base *Puntero = new ClaseHija();


Si ClaseHija no tiene su destructor declarado como virtual (no virtual puro!, OJO) entonces nunca se llama al destructor de la clase padre.

Ahí tienes un fallo. Es la clase Base la que ha de tener su destructor declarado como 'virtual'. Si no fuera así, al hacer upcasting sólo se llamaría al destructor de la clase Base y no al de ClaseHija.

Cita de: "Qlix=D!"
Excelente libro el de Eckel

Lo mismo digo.

Un saludo.

Ruben3d

bob esponja

  • Miembro MUY activo
  • ***
  • Mensajes: 411
    • Ver Perfil
    • http://marianoguerra.blogspot.com
Re: Clases Abstractas Y Herencia
« Respuesta #10 en: Domingo 30 de Mayo de 2004, 05:52 »
0
muchas gracias a todos era lo que necesitaba!

aguante la programacion!  :D

pd: este es el logo de freebsd? ->  :devil:   :P
porque noo veo ni pinguinos ni ventanas? :D