Torna indietro   Hardware Upgrade Forum > Software > Programmazione

DJI Lito 1 e Lito X1 recensione: i nuovi droni per principianti che non si fanno mancare nulla
DJI Lito 1 e Lito X1 recensione: i nuovi droni per principianti che non si fanno mancare nulla
DJI ha appena ufficializzato la serie Lito, la sua nuova gamma di droni entry-level destinata a chi si avvicina per la prima volta alla fotografia aerea. Al centro dell'annuncio ci sono due modelli ben distinti per fascia di prezzo e specifiche tecniche: DJI Lito 1 e DJI Lito X1. Entrambi si collocano sotto la soglia regolamentare dei 249 grammi, che permette di volare con requisiti burocratici più semplici rispetto ai droni più pesanti.
Sony World Photography Awards 2026: i premiati, anche italiani, il punto sulla fotografia di oggi
Sony World Photography Awards 2026: i premiati, anche italiani, il punto sulla fotografia di oggi
Siamo stati a Londra per la premiazione dei Sony World Photography Awards 2026, l'evento a tema fotografia più prestigioso. Fra sorprese e novità, ne approfittiamo per fare il punto sulla fotografia contemporanea, in cui la didascalia è sempre più necessaria a cogliere il senso della quasi totalità degli scatti.
Una settimana con Hyundai Ioniq 5 N-Line: diverte e convince
Una settimana con Hyundai Ioniq 5 N-Line: diverte e convince
L'elettrica di casa Hyundai propone una versione AWD con estetica derivata dalla famiglia N. L'abbiamo provata per diversi giorni, per scoprire tutti i dettagli e la vera autonomia in autostrada
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 29-06-2014, 17:20   #1
mistergks
Senior Member
 
L'Avatar di mistergks
 
Iscritto dal: Mar 2011
Messaggi: 1050
[c++] polimorfismo: overriding

Sto studiando il polimorfismo e l'ereditarietà c++.

Ho dei dubbi:
Il polimorfismo non è nient'altro che la ridefinizione nella classe derivata di una funzione della classe base.. (Overriding).. Vero?

Non ho capito la differenza tra la ridefinizione in una classe derivata di una funzione non virtual di una classe base e la definizione di una funzione dichiarata virtual nella classe base
mistergks è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2014, 17:56   #2
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 12967
Quote:
Originariamente inviato da mistergks Guarda i messaggi
[..]
Il polimorfismo non è nient'altro che la ridefinizione nella classe derivata di una funzione della classe base.. (Overriding).. Vero?
No, quello è l'overriding appunto .

Quote:
Originariamente inviato da mistergks Guarda i messaggi
Non ho capito la differenza tra la ridefinizione in una classe derivata di una funzione non virtual di una classe base e la definizione di una funzione dichiarata virtual nella classe base
Il che mi fa supporre che tu non abbia studiato bene cosa è un metodo virtuale e cos'è il polimorfismo.

Comunque in soldoni:

Il polimorfismo è la capacità di chiamare i metodi di un oggetto concreto attraverso una sua generalizzazione (ad esempio una interfaccia o una classe astratta).

Ad esempio:

Codice:
class IShape
{
public:

    virtual double area() {
       throw std::runtime_error("not implemented");
    }
};

class Rect : public IShape
{
public:

    virtual double area() {
        return lato_a*lato_b;
    }
};

class Circle : public IShape
{
public:

    virtual double area() {
        return PI*radius*radius;
    }
};

int main(void)
{
    std::vector<IShape*> shapes;

    shapes.push_back(new Circle(..));
    shapes.push_back(new Rect(..));

    for (auto sp : shapes)
    {
        std::cout << "Area of shape: " << sp->area() << std::endl;
    }

    // free resources, etc, etc...

    return 0;
}
Il meccanismo funziona perché il compilatore viene informato del fatto che il metodo è "virtuale".

Cosa significa? Che il compilatore evita di fare il collegamento tra la chiamata
Codice:
sp->area()
nel main con la funzione
Codice:
IShape::area()
ma rimanda il tutto a tempo di esecuzione (cioè durante la vita dell'oggetto).

Questa cosa prende anche il nome di late binding (binding ritardato).

Se il metodo non fosse virtual, allora il compilatore procederebbe nel solito modo, quindi il main lancerebbe subito eccezione, perché appunto il compilatore assume che stai chiamando il metodo area() della classe IShape.

Questo contrasta con Java, dove i metodi sono di default sempre virtuali (non hai bisogno infatti della parola chiave virtual).

Spero sia chiaro.

Ultima modifica di WarDuck : 29-06-2014 alle 18:05. Motivo: Cambiato il tipo di ritorno :)
WarDuck è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2014, 19:17   #3
Freaxxx
Senior Member
 
L'Avatar di Freaxxx
 
Iscritto dal: Dec 2006
Messaggi: 3808
Quote:
Originariamente inviato da mistergks Guarda i messaggi
la differenza tra la ridefinizione in una classe derivata di una funzione non virtual di una classe base
questo caso andrebbe approfondito e discusso, il punto principale dell'ereditarietà è quello di riusare codice esistente che abbia una relazione is a ( tradotto dall'inglese è un ) con la tua classe.

se hai una classe A con una funzione k non virtual, crei B ereditando da A e in B ridefinisci k, stai solo sprecando tempo e complicando il tuo lavoro ereditando da A. Tanto vale definire B come classe a se stante se la relazione alla base dell'ereditarietà is a non sussiste.

Quote:
Originariamente inviato da mistergks Guarda i messaggi
la definizione di una funzione dichiarata virtual nella classe base
Per capire questo genere di meccanismi dovresti leggere libri dedicati all'argomento, in breve potresti immaginare che quando crei il tuo oggetto x come istanza della classe X, che è all'y livello di ereditarietà rispetto alle altri classi o alla sola classe base B, il tuo oggetto per ogni funzione marcata come virtual ha un puntatore che punta ad un indirizzo indefinito al momento in cui scrivi il codice, proprio come il classico puntatore, è possibile trattare un puntatore come contenitore di indirizzi da dereferenziare, il contenuto del tuo puntatore che è in realtà l'etichetta usata per il nome della funzione, dipende dalla gerarchia delle tue classi, da come allocherai e costruirai il tuo oggetto e da come avrai dichiarato le funzioni delle tue classi.

Da notare che in C++ l'ereditarietà è multipla, e ci sono problemi legati all'ereditarietà in generale che hanno fatto perdere un po' di appeal alla pratica, inoltre c'è anche un piccolo prezzo da pagare per i metodi e le funzioni virtual dovuto al lookup del puntatore di cui sopra, e dovuto al fatto che a runtime il tuo eseguibile deve decidere quale definizione corrisponde alla tua chiamata ad una funzione virtual .

Ci sono linguaggi in cui i metodi non sono magari sempre "virtual" ma il "dynamic binding" è più esplicito come Objective-C, con un po' di Obj-C probabilmente capiresti meglio come funzionano certe cose, per altro Obj-C è praticamente una copia 1:1 di C con un po' più di puntatori buttati qua e la e qualche keyword nuova.

In C++ c'è anche il caso della funzione pure virtual che praticamente serve a "forzare la mano" a chi deriva dalla tua classe base nel definire un certo metodo, in caso contrario, cioé ereditando una pure virtual senza definirla, il codice non compila neanche.
Freaxxx è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2014, 19:51   #4
mistergks
Senior Member
 
L'Avatar di mistergks
 
Iscritto dal: Mar 2011
Messaggi: 1050
Ho letto mille volte l'argomento sul libro..
Ora ho capito la differenza. Cioe tra un overriding non virtual e una ridefinizione di un metodo virtual. In pratica si nota se istanzio un puntatore di tipo classe base che punta a un oggetto della classe derivata.

Le funzioni virtuali pure ho capito pure a cosa servono

Permettono di definire una classe astratta senza definire le funzioni nella classe stessa.. Ovviamente non è possibile istanziare un oggetto di una classe astratta.

Ma posso definire un solo metodo ad esempio?

E quando eredito la classe astratta posso ridefinire tranquillamente la funzione virtuale pura nella classe derivata e istanziare oggetti di tipo classe derivata?
mistergks è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2014, 21:35   #5
vendettaaaaa
Senior Member
 
L'Avatar di vendettaaaaa
 
Iscritto dal: Jan 2012
Messaggi: 1267
Quote:
Originariamente inviato da mistergks Guarda i messaggi
Ho letto mille volte l'argomento sul libro..
Ora ho capito la differenza. Cioe tra un overriding non virtual e una ridefinizione di un metodo virtual. In pratica si nota se istanzio un puntatore di tipo classe base che punta a un oggetto della classe derivata.

Le funzioni virtuali pure ho capito pure a cosa servono

Permettono di definire una classe astratta senza definire le funzioni nella classe stessa.. Ovviamente non è possibile istanziare un oggetto di una classe astratta.

Ma posso definire un solo metodo ad esempio?

E quando eredito la classe astratta posso ridefinire tranquillamente la funzione virtuale pura nella classe derivata e istanziare oggetti di tipo classe derivata?
Sì puoi. Finchè una classe derivata da una astratta contiene anche solo una funzione virtuale pura NON ridefinita, è ancora una classe virtuale e non puoi crearne alcuna istanza. Se definisci solo un metodo come puro e nella classe derivata lo implementi, allora puoi usare oggetti della classe derivata.
vendettaaaaa è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2014, 23:27   #6
mistergks
Senior Member
 
L'Avatar di mistergks
 
Iscritto dal: Mar 2011
Messaggi: 1050
Forse volevi dire classe base!!



[quote=vendettaaaaa;41259930Se definisci solo un metodo come puro e nella classe derivata lo implementi, allora puoi usare oggetti della classe derivata [/QUOTE]

Ultima modifica di mistergks : 29-06-2014 alle 23:30.
mistergks è offline   Rispondi citando il messaggio o parte di esso
Old 30-06-2014, 19:56   #7
vendettaaaaa
Senior Member
 
L'Avatar di vendettaaaaa
 
Iscritto dal: Jan 2012
Messaggi: 1267
Ehm... no.
vendettaaaaa è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


DJI Lito 1 e Lito X1 recensione: i nuovi droni per principianti che non si fanno mancare nulla DJI Lito 1 e Lito X1 recensione: i nuovi droni p...
Sony World Photography Awards 2026: i premiati, anche italiani, il punto sulla fotografia di oggi Sony World Photography Awards 2026: i premiati, ...
Una settimana con Hyundai Ioniq 5 N-Line: diverte e convince Una settimana con Hyundai Ioniq 5 N-Line: divert...
Recensione OPPO Find X9 Ultra: è lui il cameraphone definitivo Recensione OPPO Find X9 Ultra: è lui il c...
Ecovacs Deebot X12 OmniCyclone: lava grazie a FocusJet Ecovacs Deebot X12 OmniCyclone: lava grazie a Fo...
Xbox Game Pass sarà disponibile a...
La serie HONOR 600 avrà presto un...
Mova Viax 250 in prova: il robot tagliae...
Fat e-bike per tutti: sconti Engwe, pi&u...
Google conferma l'arrivo della nuova ver...
Apple ha trovato il modo per abbassare i...
OpenAI vuole tassare l'AI per dare a tut...
MacBook Air 15'' con chip M4 a 1.199€ su...
Samsung Galaxy S25 Edge 12/512GB a 854€ ...
Super offerta sul portatile gaming Acer ...
Nanotubi di carbonio più conduttivi del ...
LG OLED evo C5 48'' a 614€ e G5 83' a 3....
Ricavi record per Samsung ma la division...
TOP 7 Amazon del weekend: gli sconti al ...
Volvo e Design Week: al Volvo Studio di ...
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: 22:32.


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