Torna indietro   Hardware Upgrade Forum > Software > Programmazione

PC Specialist Lafité 14 AI AMD: assemblato come vuoi tu
PC Specialist Lafité 14 AI AMD: assemblato come vuoi tu
Il modello "build to order" di PCSpecialist permette di selezionare una struttura base per un sistema, personalizzandolo in base alle specifiche esigenze con una notevole flessibilità di scelta tra i componenti. Il modello Lafité 14 AI AMD è un classico notebook clamshell compatto e potente, capace di assicurare una elevata autonomia di funzionamento anche lontano dalla presa di corrente
Recensione Nothing Phone 4(a): sempre iconico ma ora più concreto
Recensione Nothing Phone 4(a): sempre iconico ma ora più concreto
Nothing con il suo nuovo Phone 4(a) conferma la sua identità visiva puntando su una costruzione che nobilita il policarbonato. La trasparenza resta l'elemento cardine, arricchita da una simmetria interna curata nei minimi dettagli. Il sistema Glyph si evolve, riducendosi nelle dimensioni ma aumentando l'utilità quotidiana grazie a nuove funzioni software integrate e notifiche visive. Ecco tutti i dettagli nella recensione completa
Corsair Vanguard Air 99 Wireless: non si era mai vista una tastiera gaming così professionale
Corsair Vanguard Air 99 Wireless: non si era mai vista una tastiera gaming così professionale
Nelle ultime settimane abbiamo provato la Corsair Vanguard Air 99 Wireless, una tastiera tecnicamente da gaming, ma che in realtà offre un ampio ventaglio di possibilità anche al di fuori delle sessioni di gioco. Flessibilità e funzionalità sono le parole d'ordine di una periferica che si rivolge a chi cerca un prodotto capace di adattarsi a ogni esigenza e ogni piattaforma
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 22-04-2009, 00:23   #1
ciuaz!!!
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);
}
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.
ciuaz!!! è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2009, 09:51   #2
Tommo
Senior Member
 
L'Avatar di Tommo
 
Iscritto dal: Feb 2006
Messaggi: 1304
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.
__________________
*ToMmO*

devlog | twitter
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2009, 11:56   #3
_Claudio
Senior Member
 
L'Avatar di _Claudio
 
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).
_Claudio è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2009, 12:47   #4
ciuaz!!!
Senior Member
 
Iscritto dal: Sep 2003
Messaggi: 572
Quote:
Originariamente inviato da Tommo Guarda i messaggi
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.

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è)...
ciuaz!!! è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2009, 14:32   #5
_Claudio
Senior Member
 
L'Avatar di _Claudio
 
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.
_Claudio è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2009, 14:47   #6
Tommo
Senior Member
 
L'Avatar di Tommo
 
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....
__________________
*ToMmO*

devlog | twitter

Ultima modifica di Tommo : 22-04-2009 alle 14:56.
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2009, 14:56   #7
_Claudio
Senior Member
 
L'Avatar di _Claudio
 
Iscritto dal: Aug 2005
Messaggi: 579
Quote:
Originariamente inviato da Tommo Guarda i messaggi
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
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.
_Claudio è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


PC Specialist Lafité 14 AI AMD: assemblato come vuoi tu PC Specialist Lafité 14 AI AMD: assemblat...
Recensione Nothing Phone 4(a): sempre iconico ma ora più concreto Recensione Nothing Phone 4(a): sempre iconico ma...
Corsair Vanguard Air 99 Wireless: non si era mai vista una tastiera gaming così professionale Corsair Vanguard Air 99 Wireless: non si era mai...
Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lavaggio è ampio Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lav...
Recensione Samsung Galaxy S26 Ultra: finalmente qualcosa di nuovo Recensione Samsung Galaxy S26 Ultra: finalmente ...
Scivolone ASRock: annuncia il Ryzen 9 99...
DLSS 5: NVIDIA spiega il funzionamento, ...
PlayStation come NVIDIA DLSS: Sony punta...
OnePlus Nord 6 sta arrivando e avr&agrav...
CPU desktop: Intel dice addio ai socket ...
Google sta testando un'app di Gemini per...
NVIDIA GeForce RTX 5070 Laptop: in arriv...
Il Tribunale di Roma ha annullato la mul...
AppleCare One potrebbe arrivare presto i...
Amazon ci riproverà: l'azienda st...
Apple e Samsung dominano la classifica d...
Un game designer di 9 anni, due fogli a ...
Il weekend Amazon parte col botto: gross...
Amazfit Active 2 scende a 69,99€: i migl...
Smart TV No IVA su Amazon: QLED, Mini-LE...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 02:56.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v