PDA

View Full Version : [C++] ereditarietà


giulioballio
23-07-2007, 13:40
Ho un dubbio abbastanza specifico sull'ereditarietà. In main.cpp definisco:

class Child: public Parent
{
public:
void eval(real *values, const real *x) {anything}
};

il cui unico scopo è di definire eval che era virtual in Parent. Ora sempre in main.ccp scrivo:

Child obj;
Solver pde(obj);

avendo definito in sover.cpp il seguente costruttore:

Solver::Solver(Parent& input)
{
input.eval(values,x);
}

ottengo un errore perché eval è visto come quella del genitore, cioè come virtual. D'altro canto non posso chiedere un Child& come argomento perché Solver non sa della sua esistenza.. potrei rimediare mettendoci una pezza, tuttavia sono interessato a capire come è meglio che io risolva la situazione secondo la logica di C++. Grazie!

cionci
23-07-2007, 14:29
virtual rimane nella gerarchia anche se non viene più esplicitato.
Ma quella chiamata, proprio perché usi virtual dovrebbe riferirsi alla eval di Child...

giulioballio
23-07-2007, 14:44
virtual rimane nella gerarchia anche se non viene più esplicitato.
Ma quella chiamata, proprio perché usi virtual dovrebbe riferirsi alla eval di Child...

purtroppo nelle librerie che sto usando virtual è definito nell'header di Parent, ma poi in parent.cpp è definito come il solo messaggio di errore che dice che va overloaded.. può essere questo che incasina il tutto?

giulioballio
23-07-2007, 19:20
virtual rimane nella gerarchia anche se non viene più esplicitato.
Ma quella chiamata, proprio perché usi virtual dovrebbe riferirsi alla eval di Child...

parent.h contiene:

virtual void eval (real *values, const real *x) const
virtual real eval (const real *x) const

parent.cpp tuttavia definisce i metodi come:

void Parent::eval(real* values, const real* x) const
{
// Try scalar function if not overloaded
values[0] = eval(x);
}

real Parent::eval(const real* x) const
{
error("Missing eval() for user-defined function (must be overloaded).");
return 0.0;
}

potrebbe essere questo il problema? Il compilatore non dovrebbe vedere cmq i metodi come virtual e chiamare quelli di Child?

giulioballio
23-07-2007, 19:29
sono un cretino avevo ignorato la dichiarazione const scusate