PDA

Visualizza la versione completa : [C++] Funzioni virtual void, Super, e override con Unreal Engine


Yurij_89
22-12-2017, 18:47
Ciao, mastico leggermente il C++ e stavo guardando un tutorial sui primi script di esempio che si possono fare su Unreal Engine 4. Purtroppo il tizio è americano e io non vado d'accordo con il loro modo di spiegare le cose.

Dunque, nell'esempio fa vedere che in una classe genitore
(chiamiamola, ad esempio, Pallina.h, che è relativa ad una pallina messa nella scena),
c'è una funzione così:

virtual void BeginPlay() override;

Poi, nel file Pallina.cpp, vedo:

void APallina::BeginPlay()

{
Super::BeginPlay();

}


E' una funzione che serve a far "spawnare" la pallina nella scena e a darle vita appena inizia il gioco.

Ecco io ho letto in giro che virtual void serve a dare la possibilità di modificare la funzione a partire da classi figlie.
Ma in questo caso non capisco a cosa servano le scritte "override", e "Super::", perché se sul web cerco a che cosa serve virtual void non ci sono queste scritte aggiuntive, quindi penso che siano opzionali ma nel tutorial le dà per scontate e non le spiega, perché è una funzione già scritta di default e quindi la tralascia. Io invece volevo capire a che cosa servono e che cosa fanno così composte.

Il tutorial è questo (https://www.youtube.com/watch?v=l6pRgMhzCt8) ma è lungo 12 minuti e parte proprio dalla base delle basi per neofiti, quindi non sta facendo niente di articolato.

shodan
22-12-2017, 19:51
override è un hint al compilatore e serve a forzare il compilatore stesso a verificare che il prototipo della funzione base e di quella derivata siano uguali. Se infatti la funzione di base fosse:


Base::BeginPlay() const;

e quella di APallina fosse:


APallina::BeginPlay(); // manca il const

il compilatore le tratta come due funzioni diverse e non ti dice niente.
Viceversa se fosse:


Base::BeginPlay() const;

e quella di APallina fosse:


APallina::BeginPlay() override; // manca il const

il compilatore (in base ai settaggi), può lanciare un warning o un errore e dirti che APallina::BeginPlay(); (senza il const) non ridefinisce nessuna funzione di Base.
Per quanto riguarda Super è un typedef della classe base e serve a richiamare esplicitamente la funzione base.

Yurij_89
22-12-2017, 23:40
Ah grazie, quindi questo override è messo apposta per garantire che quando BeginPlay modificherà quel virtual void padre, lo farà solo se è uguale?
Quindi è opzionale, ma utile... Ok.
Ma in che misura un virtual void si lascia modificare? Lascia che tutto il contenuto si ridefinisca, se ne verrà scritto a mano nella funzione figlia?

E quindi invece Super, semplicemente richiama la funzione base senza aggiunte... Ma in tal caso allora perché non bastava scrivere solo BeginPlay(); senza il Super?

shodan
23-12-2017, 00:46
Si, per avere il polimorfismo i prototipi di funzione padre e figlia devono essere identici.


Ma in che misura un virtual void si lascia modificare?

Totalmente. La funzione polimorfica figlia può essere vuota, aggiungere codice, resettarti la macchina. Dipende da cosa ci scrivi dentro. C'è totale libertà.


Ma in tal caso allora perché non bastava scrivere solo BeginPlay(); senza il Super?

Senza il Super, BeginPlay() richiamerebbe se stessa ricorsivamente. Specificando Super indichi che vuoi richiamare la funzione padre eliminando il momentaneamente il polimorfismo della funzione.

Loading