|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Sep 2003
Messaggi: 572
|
[C++]Per gli esperti: static_cast & base virtuale
Codice:
#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);
}
Perchè? Badate bene, non mi è chiaro il perchè... so che per fare la conversione dovrei usare il dynamic_cast. |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Aug 2005
Messaggi: 579
|
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).
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Sep 2003
Messaggi: 572
|
Quote:
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à? 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è)... |
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Aug 2005
Messaggi: 579
|
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. |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
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 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" Mi sembra solo un modo di aggiungere complessità a caso.... Ultima modifica di Tommo : 22-04-2009 alle 14:56. |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Aug 2005
Messaggi: 579
|
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.
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:21.




















