Salve a tutti, sto scrivendo delle classi che mi serviranno per risolvere dei problemi di meccanica analitica. Per me sarebbe importante fare una cosa del genere:
Pensandola in queso modo io potevo differenziare i vari oggetti in base alle forze agenti su di essi (per esempio la classe derivata potrebbe aggiungere forze dissipative, o reazioni vincolari).codice://Mathvector è una classe che modella un vettore inteso in senso matematico class Base{ public: //costruttori e distruttore virtual MathVector NetForce(); //calcola la somma vettoriale di tutte le forze agenti sul corpo MathVector speed(double seconds); /* vari metodi che utilizzano al loro interno i metodi virtuali. */ Protected: double mass; } class Derived: public Base{ //reimplementare solo i metodi virtuali } MathVector Base::speed(double seconds) //per esempio { return NetForce()/mass*seconds; }
La domanda è se posso essere sicuro che quando chiamo un metodo non virtuale della classe derivata esso al proprio interno chiami il metodo virtuale esatto.
Cioè che
Su alcuni test che ho fatto funziona, ma leggendo in giro dicono che questo approccio sia pericoloso e che il comportamento del programma potrebbe essere indefinito: è vero o va bene così?codice:Base* base = new Base(); Base *derived = new Derived(); base->speed(); //chiami Base::NetForce(); derived->speed(); //chiami Derived::NetForce();
Avete mai fatto qualcosa di simile?
Cambiando approccio dovrei reimplementare praticamente tutti i metodi della classe base, che però sono molti e perderei il vantaggio del poterli derivare da una classe base che astrae il problema di calcolare gli stati di un corpo libero indipendentemente dalle forze/vincoli applicati?
EDIT:
In particolare ho trovato un articolo che parlava di una situazione simile alla mia e cito testualmente:
Il risultato in queste situazioni e` che il comportamento che una classe puo` avere e` molto difficile da controllare e potrebbe essere potenzialmente errato; l'errore legato a situazioni di questo tipo e` noto in letteratura come fragile class problem e puo` essere causa di forti inconsistenze.