Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Parole Chiave Virtual e Override | Panoramica sul Polimorfismo
OOP in C++
course content

Contenuti del Corso

OOP in C++

OOP in C++

1. Fondamenti della OOP in C++
2. Costruttori e Distruttori
3. Panoramica sull'Incapsulamento
4. Panoramica sull'Ereditarietà
5. Panoramica sul Polimorfismo

book
Parole Chiave Virtual e Override

Parola chiave Virtual

La parola chiave virtual viene utilizzata prima della dichiarazione di un metodo in una class per risolvere il problema discusso in precedenza. Si impiega per i metodi comuni a tutte le sottoclassi ma che richiedono implementazioni distinte per ciascuna. In sostanza, appare come una normale dichiarazione di metodo, ad eccezione del fatto che inizia con virtual.

Base.h

Base.h

copy
1234567
class Base { public: virtual void display() { std::cout << "Base class display() called" << std::endl; } };

Quando una funzione viene dichiarata come virtual in una superclasse, consente di essere sovrascritta in una sottoclasse. Questo significa che la sottoclasse può fornire la propria implementazione, che verrà invocata al posto dell'implementazione originale quando la funzione viene chiamata tramite un puntatore o riferimento alla superclasse.

main.cpp

main.cpp

copy
123456789101112131415161718192021222324252627
#include <iostream> class Base { public: virtual void display() { std::cout << "Base display() called" << std::endl; } }; class Derived : public Base { public: void display() { std::cout << "Derived display() called" << std::endl; } }; int main() { Base* obj; Derived derived; obj = &derived; obj->display(); }
Note
Nota

Quando si dispone di un puntatore a un oggetto e si desidera accedere ai suoi membri tramite il puntatore, si utilizza l'operatore freccia (->).

Ritornando alla soluzione per il problema originale con i pulsanti, questo metodo consente di creare facilmente una singola funzione che accetta un puntatore al Button padre come parametro. Di conseguenza, è possibile invocare questa funzione passando un SubmitButton, ResetButton o CancelButton, e si comporterà come previsto.

main.cpp

main.cpp

copy
12345678910111213141516171819202122232425262728293031
#include <iostream> class Button { public: virtual void onClick() { std::cout << "Click" << std::endl; } }; class UploadButton : public Button { public: void onClick() { std::cout << "Upload" << std::endl; } }; class ResetdButton : public Button { public: void onClick() { std::cout << "Reset" << std::endl; } }; class CancelButton : public Button { public: void onClick() { std::cout << "Cancel" << std::endl; } }; void user_clicked_button(Button& btn) { btn.onClick(); } int main() { UploadButton uploadButton; user_clicked_button(uploadButton); }
Note
Nota

Provare a creare oggetti di diverse sottoclassi e passarli alla funzione.

La parola chiave Override

La parola chiave override viene utilizzata in una sottoclasse per indicare esplicitamente che una funzione membro esegue l'override di una funzione virtuale proveniente da una superclasse. Aiuta a rilevare errori in fase di compilazione se la firma della funzione nella sottoclasse non corrisponde a nessuna funzione virtuale nella superclasse.

main.cpp

main.cpp

copy
1234567891011121314
#include <iostream> class Button { public: virtual void handleClick() { std::cout << "Click" << std::endl; } }; class UploadButton : public Button { public: // marked override, but does not override void onClick() override { std::cout << "Upload" << std::endl; } }; int main() { }

Se c'è un errore, come un errore di battitura nella firma della funzione o la superclasse non possiede la funzione che si sta tentando di sovrascrivere, il compilatore genererà un errore, aiutando a individuare potenziali bug in fase di compilazione. Questa funzionalità è particolarmente utile in ambienti di lavoro di grandi dimensioni, dove tenere traccia di modifiche come la rinomina dei metodi può essere complesso.

question mark

Qual è lo scopo principale della parola chiave virtual?

Select the correct answer

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 5. Capitolo 2

Chieda ad AI

expand

Chieda ad AI

ChatGPT

Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione

course content

Contenuti del Corso

OOP in C++

OOP in C++

1. Fondamenti della OOP in C++
2. Costruttori e Distruttori
3. Panoramica sull'Incapsulamento
4. Panoramica sull'Ereditarietà
5. Panoramica sul Polimorfismo

book
Parole Chiave Virtual e Override

Parola chiave Virtual

La parola chiave virtual viene utilizzata prima della dichiarazione di un metodo in una class per risolvere il problema discusso in precedenza. Si impiega per i metodi comuni a tutte le sottoclassi ma che richiedono implementazioni distinte per ciascuna. In sostanza, appare come una normale dichiarazione di metodo, ad eccezione del fatto che inizia con virtual.

Base.h

Base.h

copy
1234567
class Base { public: virtual void display() { std::cout << "Base class display() called" << std::endl; } };

Quando una funzione viene dichiarata come virtual in una superclasse, consente di essere sovrascritta in una sottoclasse. Questo significa che la sottoclasse può fornire la propria implementazione, che verrà invocata al posto dell'implementazione originale quando la funzione viene chiamata tramite un puntatore o riferimento alla superclasse.

main.cpp

main.cpp

copy
123456789101112131415161718192021222324252627
#include <iostream> class Base { public: virtual void display() { std::cout << "Base display() called" << std::endl; } }; class Derived : public Base { public: void display() { std::cout << "Derived display() called" << std::endl; } }; int main() { Base* obj; Derived derived; obj = &derived; obj->display(); }
Note
Nota

Quando si dispone di un puntatore a un oggetto e si desidera accedere ai suoi membri tramite il puntatore, si utilizza l'operatore freccia (->).

Ritornando alla soluzione per il problema originale con i pulsanti, questo metodo consente di creare facilmente una singola funzione che accetta un puntatore al Button padre come parametro. Di conseguenza, è possibile invocare questa funzione passando un SubmitButton, ResetButton o CancelButton, e si comporterà come previsto.

main.cpp

main.cpp

copy
12345678910111213141516171819202122232425262728293031
#include <iostream> class Button { public: virtual void onClick() { std::cout << "Click" << std::endl; } }; class UploadButton : public Button { public: void onClick() { std::cout << "Upload" << std::endl; } }; class ResetdButton : public Button { public: void onClick() { std::cout << "Reset" << std::endl; } }; class CancelButton : public Button { public: void onClick() { std::cout << "Cancel" << std::endl; } }; void user_clicked_button(Button& btn) { btn.onClick(); } int main() { UploadButton uploadButton; user_clicked_button(uploadButton); }
Note
Nota

Provare a creare oggetti di diverse sottoclassi e passarli alla funzione.

La parola chiave Override

La parola chiave override viene utilizzata in una sottoclasse per indicare esplicitamente che una funzione membro esegue l'override di una funzione virtuale proveniente da una superclasse. Aiuta a rilevare errori in fase di compilazione se la firma della funzione nella sottoclasse non corrisponde a nessuna funzione virtuale nella superclasse.

main.cpp

main.cpp

copy
1234567891011121314
#include <iostream> class Button { public: virtual void handleClick() { std::cout << "Click" << std::endl; } }; class UploadButton : public Button { public: // marked override, but does not override void onClick() override { std::cout << "Upload" << std::endl; } }; int main() { }

Se c'è un errore, come un errore di battitura nella firma della funzione o la superclasse non possiede la funzione che si sta tentando di sovrascrivere, il compilatore genererà un errore, aiutando a individuare potenziali bug in fase di compilazione. Questa funzionalità è particolarmente utile in ambienti di lavoro di grandi dimensioni, dove tenere traccia di modifiche come la rinomina dei metodi può essere complesso.

question mark

Qual è lo scopo principale della parola chiave virtual?

Select the correct answer

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 5. Capitolo 2
some-alt