Dev - C++ - herencia

 
Vista:
Imágen de perfil de felipe
Val: 141
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

herencia

Publicado por felipe (74 intervenciones) el 19/12/2020 06:17:12
existe una funcion que recibe como parametro un objeto de tipo Entity.
si se crea una nueva clase heredada de la clase entity, se puede enviar ese objeto como parametro a la funcion?
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
Imágen de perfil de Alfil
Val: 4.344
Oro
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

herencia

Publicado por Alfil (1444 intervenciones) el 19/12/2020 12:13:13
Habría que ver el código concreto pero sí, sí se puede enviar un objeto de una clase heredada como un objeto de la clase base, aunque, las funciones que herede de la clase base que hayan sido rescritas en la clase heredada, deberían ser virtuales.
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
Imágen de perfil de Alfil
Val: 4.344
Oro
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

herencia

Publicado por Alfil (1444 intervenciones) el 19/12/2020 16:10:17
Me falto decir quer para que el polimorfismo funcione, los objetos han de crearse (y pasarse) como punteros.
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
Imágen de perfil de Rodrigo
Val: 1.755
Plata
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

herencia

Publicado por Rodrigo (539 intervenciones) el 19/12/2020 16:50:37
Estoy en acuerdo parcial con lo dicho:

Efectivamente el metodo tiene que ser definido virtual, pero no existe restriccion de como los objetos se crean, ni tampoco es necesario pasarse como punteros (solamente) para que la funcion virtual sea llamada.

Aqui se muestran algunas variantes:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include<iostream>
 
using namespace std;
 
class Base {
    public: virtual void f() { cout << "Base" << endl; }
};
 
class D1 : public Base {
   void f() { cout << "D1" << endl; }
};
 
class D2 : public Base {
    void f() { cout << "D2" << endl; }
};
 
void puntero(Base *b)    { b->f(); }
void referencia(Base &b) { b.f();  }
void base(Base b)        { b.f();  }
 
void test_objetos() {
    D1 d1;
    D2 d2;
 
    puntero(&d1); puntero(&d2);     // D1 D2
    referencia(d1); referencia(d2); // D1 D2
    base(d1); base(d2);             // Base Base
}
 
void test_puntero_clase_base() {
    Base *pd1 = new D1();
    Base *pd2 = new D2();
 
    puntero(pd1); puntero(pd2);         // D1 D2
    referencia(*pd1); referencia(*pd2); // D1 D2
    base(*pd1); base(*pd2);             // Base Base
}
 
void test_puntero_clase() {
    D1 *pd1 = new D1();
    D2 *pd2 = new D2();
 
    puntero(pd1); puntero(pd2);         // D1 D2
    referencia(*pd1); referencia(*pd2); // D1 D2
    base(*pd1); base(*pd2);             // Base Base
 
}
 
int main()
{
    test_objetos();
    test_puntero_clase_base();
    test_puntero_clase();
}

Si el link no expira, se puede ver la salida aqui
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