Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Poo: C++, Especialización ?

Iniciado por Degiik, 02 de Abril de 2004, 01:27:47 AM

« anterior - próximo »

Degiik

 #include <stdio.h>
#include <conio.h>

class a
   {
   public:
   int i,j;

   a(){i=10;j=-10;}
   void imprimir (int v1) { printf ("%d",v1); }
   void imprimir (int v1, int v2) { printf ("%d, %d",v1,v2); }
   void otra_imprimir (int v1) { printf (" %d",v1); }

   };

class b:public a
   {
   public:
       void imprimir (void) { printf ("%d, %d",i,j); }
   };

void main (void)
   {
   b obj_b;
   
   obj_b.imprimir();

   //error C2660: 'b::imprimir' : la función no acepta 1 parámetros  :blink:
   obj_b.imprimir(2); // error  O_O
               
   obj_b.otra_imprimir(2);

   getch();
   }



Que me he perdido ultimamente ? pq pierdo los metodos imprimir de la clase base cuando la clase deribada tiene un método con el mismo nombre ?
Sobrecargo operadores de la clase base, ok y si quiero cargar los mismos en la derivada... ...hasta luego lucas...
C++ una de sus caracteristicas no es la Especializacion ?  O_O
egiik: h-O-5 hoja/ingestión 100mo Vida suspendida ( 1 día )

Carlos

 Le tienes que poner virtual delante del metodo que puede ser sobre-escrito.

Salu2

MChiz

 Holap!

Lo unico que se me ocurre es que hagas algo así:
  obj_b.a::imprimir(2);

Sí que es un poco feo el tema, sí. No me había encontrado con esto nunca =(

Un saludote!

javiel

 creo que lo que tienes que hacer es poner los métodos de la clase "a" como protected


class a
  {
  protected:
  int i,j;

  a(){i=10;j=-10;}
  void imprimir (int v1) { printf ("%d",v1); }
  void imprimir (int v1, int v2) { printf ("%d, %d",v1,v2); }
  void otra_imprimir (int v1) { printf (" %d",v1); }

  };



Esto hace que los métodos sean públicos para las clases heredadas y privadas para las demás clases

saludos
uper-Tirititran: el superhéroe gaditano (http://www.super-tirititran.com)

Carlos

 La respuesta que di anteriormente esta erronea; Lo que creo que pasa es que tu en la clase "a" defines el metodo "imprimir" con dos variantes segun el numero de parametros; Cuando en la clase "b" sobre-escribes el metodo "imprimir" con otro nuevo que tambien se llama "imprimir", este ultimo por asi decirlo chanca completamente el "imprimir" de la clase "a".
En la clase "b" no puedes usar algunas de las variantes de "imprimir" porque la clase "b" ya no tiene referencias a el metodo imprimir de la clase "a".
Lo que tendrias que hacer es redefinir las dos variantes en "b" y que en el codigo llamen a sus correspondientes metodos en la clase papa ( la "a" )

El asunto es un poco confuso conceptualmente pero creo que eso es lo que pasa.

Salu2


#include
#include

class a
  {
  public:
  int i,j;

  a(){i=10;j=-10;}
  void imprimir (void) { printf ("a - %d, %d\n",i,j); };
  void imprimir (int v1) { printf ("a - %d\n",v1); };
  void imprimir (int v1, int v2) { printf ("a - %d, %d\n",v1,v2); };
  void otra_imprimir (int v1) { printf ("a - %d\n",v1); };

  };


class b:public a
  {
  public:
      void imprimir (void) { printf ("b - %d, %d\n",i,j); };
      void imprimir (int v1) { a::imprimir( v1 ); }
      void imprimir (int v1, int v2) { a::imprimir( v1, v2 ); }

  };


void main (void)
  {
  b obj_b;
 
  obj_b.imprimir();

  //error C2660: 'b::imprimir' : la función no acepta 1 parámetros  :blink:
  obj_b.imprimir(2); // error  
             
  obj_b.otra_imprimir(2);

  getch();
  }

samsaga2

 Si tocar ni una sola linia:
 b - 10, -10
 a - 2
 a - 2

Eso si, compilado con el gcc que no tiene tantos bugs como el visual c++
:rolleyes:

Es decir... el programa esta perfecto lo que falla es el compilador, cambiado de compilador se soluciona todo  B)

Es bastante conocida la gran cantidad de bugs que tiene el visual c++ al compilar codi en c++.

Degiik

 MChiz tu solución es la que utilizo, la de Carlos pues tampoco esta mal pero...  ...mu parche a mi entender... ...y sorprendido 'habemus' de que unos compiladores no dan problemas... ...y el de vc6 y putoNet si... ...incluso el mítico Turbo C de Borland tb peta...  :(  ...vamos es como si te enteras que tu abuelo es gay  :ph34r:
egiik: h-O-5 hoja/ingestión 100mo Vida suspendida ( 1 día )

MChiz

 Holap!

Bueno, despues de todo me alegro de haberte sido de ayuda =)

Un saludote!!






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.