Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
vivo X300 Pro rappresenta un'evoluzione misurata della serie fotografica del produttore cinese, con un sistema di fotocamere migliorato, chipset Dimensity 9500 di ultima generazione e l'arrivo dell'interfaccia OriginOS 6 anche sui modelli internazionali. La scelta di limitare la batteria a 5.440mAh nel mercato europeo, rispetto ai 6.510mAh disponibili altrove, fa storcere un po' il naso
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2 è la nuova handheld PC gaming con processore AMD Ryzen Z2 Extreme (8 core Zen 5/5c, GPU RDNA 3.5 16 CU) e schermo OLED 8,8" 1920x1200 144Hz. È dotata anche di controller rimovibili TrueStrike con joystick Hall effect e una batteria da 74Wh. Rispetto al dispositivo che l'ha preceduta, migliora ergonomia e prestazioni a basse risoluzioni, ma pesa 920g e costa 1.299€ nella configurazione con 32GB RAM/1TB SSD e Z2 Extreme
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
A re:Invent 2025, AWS mostra un’evoluzione profonda della propria strategia: l’IA diventa una piattaforma di servizi sempre più pronta all’uso, con agenti e modelli preconfigurati che accelerano lo sviluppo, mentre il cloud resta la base imprescindibile per governare dati, complessità e lock-in in uno scenario sempre più orientato all’hybrid cloud
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


Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria Recensione vivo X300 Pro: è ancora lui il...
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'...
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti AWS re:Invent 2025: inizia l'era dell'AI-as-a-Se...
Cos'è la bolla dell'IA e perché se ne parla Cos'è la bolla dell'IA e perché se...
BOOX Palma 2 Pro in prova: l'e-reader diventa a colori, e davvero tascabile BOOX Palma 2 Pro in prova: l'e-reader diventa a ...
Roscosmos ha posticipato (ancora) il lan...
Isar Aerospace si prepara al secondo lan...
Tory Bruno è entrato in Blue Orig...
Fujifilm lancia la cartuccia per archivi...
Dreame H15 Mix: la soluzione 7-in-1 per ...
AirPods Pro 3 in forte sconto su Amazon:...
36 offerte Amazon, molte appena partite:...
2 caricatori multipli eccezionali: da 28...
OLED e 360 Hz a un prezzo senza preceden...
Roborock Q10 S5+ a un prezzo molto conve...
Upgrade PC a prezzo ridotto: le migliori...
Sono i 6 smartphone migliori su Amazon: ...
Google Pixel 9a a 361€, mai così ...
Super sconti sugli spazzolini Oral-B, an...
Aspira a 6000Pa, lava bene, costa 139€: ...
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: 00:21.


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