View Full Version : [C++]Per gli esperti: static_cast & base virtuale
ciuaz!!!
21-04-2009, 23:23
#include <iostream>
using namespace std;
class B
{ public:
int b;
};
class D: virtual public B
{ public:
int d;
};
main(){
B* p=new D;
D* pp=static_cast<D*>(p);
cout<<(pp->d=4);
}
errore: "non può convertire via virtual base"
Perchè?
Badate bene, non mi è chiaro il perchè... so che per fare la conversione dovrei usare il dynamic_cast.
Missà che devi scrivere class D : public B...
eppoi la classe deve essere polimorfica, ovvero deve avere almeno un metodo virtuale, per riuscire a fare il downcast.:stordita:
_Claudio
22-04-2009, 10:56
Semplice, B è virtuale rispetto D, quindi staticamente è come se non esistesse, e se fai un cast statico ti trovi ad avere un oggetto B che è astratto rispetto D assegnato ad un oggetto concreto residente in memoria (pp).
ciuaz!!!
22-04-2009, 11:47
Missà che devi scrivere class D : public B...
eppoi la classe deve essere polimorfica, ovvero deve avere almeno un metodo virtuale, per riuscire a fare il downcast.:stordita:
Si si per il dynamic_cast avrei dovuto mettere un metodo virtuale, ma a me interessava lo static_cast.
@_Claudio: ehm non ti offendi se ti dico che ho capito a metà? :stordita:
Mi ero fatto una mezza idea leggendo qualcosa qui e là, ma molto superficiale: in pratica c'entra il fatto che lo static_cast "aggiusta" il puntatore da un tipo ad un altro... per fare questo aggiustamento deve sapere esattamente di quanto spostarlo.
Ma il B qui sopra è una base virtuale quindi sottooggetto comune di potenziali gerarchie a diamante e lo static_cast non sarebbe più capace di calcolare il nuovo indirizzo del puntatore (mi sfugge il perchè)...
_Claudio
22-04-2009, 13:32
In effetti ciò che ho detto è un concentrato... troppo concentrato... dovresti rileggerlo passo a passo.
In sostanza quando fai static_cast è il compilatore ad aggiustare il tipo staticamente. Lui rileva che il tipo statico di p è B e gli viene chiesto di fare un cast statico da un elemento che ha tipo (statico) B ad un elemento che ha tipo statico D che se è vero che estende B, lo estende però virtualmente il che vuol dire che il link tra D e B è risolto solo a run-time per definizione e staticamente pp non ha la minima idea di cosa voglia dire B in questo senso.
Allora vado OT e chiedo: che cosa significa usare virtual public nella dichiarazione di ereditarietà?
Non l'ho mai visto fare, ne ho idea di che possa significare... intanto me lo cerco da me sul google :D
EDIT: da quello che ho capito, virtual public "fonde" i membri della classe base, se dovesse essere ereditata più di una volta.
Probabilmente static_cast fallisce perchè ha una super-superclass i cui membri non sono conosciuti del tutto al compiler, e non può fare il cast con questa ambiguità.
Cmq è una di quelle cose stile "se lo conosci lo eviti" :asd:
Mi sembra solo un modo di aggiungere complessità a caso....
_Claudio
22-04-2009, 13:56
Allora vado OT e chiedo: che cosa significa usare virtual public nella dichiarazione di ereditarietà?
Non l'ho mai visto fare, ne ho idea di che possa significare... intanto me lo cerco da me sul google :D
Significa specificare che B rispetto D è astratta, è una classe base che fornisce solo un'interfaccia per la realizzazione di D, ma a differenza di altri linguaggi (es. Java) a runtime se in D non è specificata la ridefinizione un metodo presente in B allora anche per un oggetto di tipo D alla chiamata di quel metodo viene avviato quello definito in B, ma solo a runtime.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.