Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    23

    [C++] Funzioni virtual void, Super, e override con Unreal Engine

    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 ma è lungo 12 minuti e parte proprio dalla base delle basi per neofiti, quindi non sta facendo niente di articolato.

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    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:
    codice:
    Base::BeginPlay() const;
    e quella di APallina fosse:
    codice:
    APallina::BeginPlay(); // manca il const
    il compilatore le tratta come due funzioni diverse e non ti dice niente.
    Viceversa se fosse:
    codice:
    Base::BeginPlay() const;
    e quella di APallina fosse:
    codice:
    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.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    23
    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?

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    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.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.