• Domingo 15 de Diciembre de 2024, 14:19

Autor Tema:  Pregunta sobre tratamiento de metodos en C++  (Leído 1772 veces)

LolazoMan

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Pregunta sobre tratamiento de metodos en C++
« en: Lunes 15 de Diciembre de 2008, 13:28 »
0
Hola, esta es una pregunta de un examen y la solucion es:  6, 4, 6, 15.   Sin embargo, a mi me sale 6, 4 , 15, 15.  

Es decir, mi pregunta es, por que en el main, en el segundo cout << a.f(4) <<endl; no se llama a la f de C2 y si a la de C, habiendo echo previamente la asignacion a=c ? Espero haberme expresado con claridad.

P.D: Soy algo novato con C++ y tengo entendido que el tratamiento dinamico de metodos es igual que en JAVA (espero no estar equivocado)

#include <cstdlib>
#include <iostream>
using namespace std;

class C {
private: int v;
public:
C(){ v=2;}
int f(int z) {return z + v;}
};

class C1: public C{
public:
int w;
C1(){w=4;}
};

class C2: public C1{
public:
int x;
C2(){x=7;}
int f(int z) {return 2*z + x;}
};

class C3: public C{
public:
int y;
C3(){y=7;}
};

void main() {
C a;
C1 b;
C2 c;
C3 d;
cout << a.f(4) <<endl;
a=c;
cout << c.w << endl;
cout << a.f(4) <<endl;
cout << c.f(4) << endl;
}

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Pregunta sobre tratamiento de metodos en C++
« Respuesta #1 en: Lunes 15 de Diciembre de 2008, 15:38 »
0
cout << a.f(4) <<endl;

Esto ejecuta el metodo f de la clase C (estos nombres solo llevan a la confusion), a es un objeto de la clase C. Lo que hace a=c; es nada en definitiva ya que C tiene un solo campo (v) y en el objeto c no se lo cambia el estado de a no varia al hacer esa asignacion. Entonces se ejecuta su metodo:
int f(int z) {return z + v;}

z es 4 y v es 2.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

LolazoMan

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Pregunta sobre tratamiento de metodos en C++
« Respuesta #2 en: Lunes 15 de Diciembre de 2008, 16:12 »
0
Gracias por responder pero, perdona, pero no entiendo tu explicacion.

La clase C tiene mas de un campo, no solo v, sino tambien el metodo f y, en concreto esta frase "Lo que hace a=c; es nada en definitiva ya que C tiene un solo campo (v) y en el objeto c no se lo cambia el estado de a no varia al hacer esa asignacion. Entonces se ejecuta su metodo:" no la entiendo.

¿Podrias ser un poco mas preciso por favor?

Yo ahi lo que estoy viendo es que se hace una asignacion de un objeto de la clase C a uno de la clase C2, por lo tanto, hay tratamiento dinamico de metodos y, al ejecutar cout << a.f(4) <<endl; se deberia de usar la f de C2 y no la de C.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Pregunta sobre tratamiento de metodos en C++
« Respuesta #3 en: Lunes 15 de Diciembre de 2008, 16:29 »
0
No, f es un metodo (funcion miembro), no un campo (atributo, dato miembro).

La verdad es que soy preciso, es muy especifico lo que hace el programa y si lo que estas buscando es dynamic binding entonces no lo vas a encontrar, en ese codigo solo hay static binding. En C++ necesitas metodos virtuales y punteros o referencias:

Código: Text
  1.  
  2. class C {
  3. private: int v;
  4. public:
  5. C(){ v=2;}
  6. virtual int f(int z) {return z + v;}
  7. };
  8.  
  9. ....
  10.  
  11. C *z = &c;
  12. cout << z->f(4) << endl;
  13.  
  14. o
  15.  
  16. C &z = c;
  17. cout << z.f(4) << endl;
  18.  
  19.  

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

LolazoMan

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Pregunta sobre tratamiento de metodos en C++
« Respuesta #4 en: Lunes 15 de Diciembre de 2008, 16:41 »
0
Yo te lo comentaba basandome en el funcionamiento en Java ya que de C++ se mas bien poco, quizas por eso te pareció raro que te pidiera mas precision.

Entonces, la pregunta se podria reducir a:

En C++, si yo tengo un objeto a de la clase C y un objeto a1 de la clase C1, siendo C1 subclase de C, y ambas clases teniendo un metodo llamado f, al hacer a=a1 se sustituye la funcion f de a por la funcion f de a1?? Basicamente es eso a lo que me refiero.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Pregunta sobre tratamiento de metodos en C++
« Respuesta #5 en: Lunes 15 de Diciembre de 2008, 16:50 »
0
Cita de: "LolazoMan"
En C++, si yo tengo un objeto a de la clase C y un objeto a1 de la clase C1, siendo C1 subclase de C, y ambas clases teniendo un metodo llamado f, al hacer a=a1 se sustituye la funcion f de a por la funcion f de a1?? Basicamente es eso a lo que me refiero.

No a menos que hagas dynamic binding.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

LolazoMan

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Pregunta sobre tratamiento de metodos en C++
« Respuesta #6 en: Lunes 15 de Diciembre de 2008, 16:54 »
0
Ok, muchas gracias por las respuestas y por la paciencia.

Un saludo.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Pregunta sobre tratamiento de metodos en C++
« Respuesta #7 en: Lunes 15 de Diciembre de 2008, 16:57 »
0
De nadas  B)

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.