C/Visual C - herencia desde una clase concreta

 
Vista:

herencia desde una clase concreta

Publicado por manuel (14 intervenciones) el 09/07/2006 18:40:09
hola.

es permitido hacer lo sgte:?

1) tengo una clase en dos archivos:

en archivo A.hpp tengo:

class A
{
public:
A();
~A();
int print();
};

y en archivo A.cpp tengo:

#include "A.hpp"
A::A(){}
A::~A(){}
int A::print()
{
cout << "clase A" << endl;
}

consideracion:
- esta clase ya esta "funcionando" un buen tiempo,
- OTRAS clases pueden estar utilizandola, conteniendola.
- los objetos de clase A puedo accesarlos mediante un puntero a clase A.

Ahora bien.
DESPUES DE UN TIEMPO veo la necesidad de crear una NUEVA clase, heredando de clase A.
si hasta hace poco 'class A' era considerada concreta, ahora la consideraria como clase base.

2) creo dos archivos mas:

archivo B.hpp contiene:

class B: public A
{
public:
B();
~B();
int print();
};

y archivo B.cpp contiene:

#include "B.hpp"
B::B():A(){}
B::~B(){}
int B::print()
{
cout << "clase B" << endl;
}

hasta aqui, clase B hereda de clase A.

El problema surge cuando quiera accesar las instancias de A y B mediante un puntero a clase A. Asi:

A *pa;
A aa;
B bb;

pa= &aa;
pa->print(); // OK. imprime "clase A"

pa=&bb;
pa->print;() // imprime "clase A". indeseado. debe imprimir "clase B".

para que funcione DEBO MODIFICAR 'A.hpp", asi:
class A
{
public:
A();
virtual ~A();
virtual int print();
};

ahora va a funcionar, PERO la duda es la sgte:
"al modificar A.hpp SOLO por querer derivar clase B, no puedo estar creando un problema para las otras clases que YA estaban utilizando la <<version antigua>> de A.hpp"?

saludos
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:herencia desde una clase concreta

Publicado por fernando.gomez (1603 intervenciones) el 10/07/2006 04:22:41
Antes hay que puntualizar que es mandarotio hacer el destructor virtual para poder heredar una clase, en caso contrario se estaría generando un comportamiento indefinido.

Con respecto a lo que comentas, pues sí se debe recompilar todas las otras clases que se esté empleando para evitar un comportamiento indefinido. Con esto de comportamiento indefinido me refiero a que puede funcionar o puede no funcionar. Eso depende de tu compilador. Más aún, puede que funcione aparentemente, y en algunos casos que no funcione.

Lo sano es que recompiles todo tu código; en el peor de los casos consulta la información de tu compilador al respecto. Si el compilador te dice que no problemo, entonces no hay problema. Si te dice que no, pues ya ni modo. Y si no te dice nada, pues te verás en un escenario de que puede que sí y puede que no.

Repito, lo mejor es que recompiles todo.

Saludos.
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