Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 25
  1. #1

    [C++] Chiarimento ereditarietà

    Ho creato una classe Pezzo e delle classi derivate da Pezzo che sono Cavallo, Torre, Alfiere, ecc...
    Tutte le classi derivate devono possedere un metodo getTipo che indichi se si tratta di un cavallo, di una torre, di un alfiere o altro. Devo dichiarare questo metodo nella classe Pezzo per poi definirlo in modo diverso in ciascuna classe derivata o devo inserirlo soltanto nelle classi derivate ma non nella classe Pezzo?

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Fai di Pezzo una classe astratta: (primo link su google, per rendere l'idea) http://en.m.wikibooks.org/wiki/C%2B%...stract_Classes
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Grazie mille!
    Ho un paio di dubbi: tutti i metodi di pezzo devono diventare virtual o soltanto getTipo? e getTipo deve essere pure virtual o semplicemente virtual?

  4. #4
    Up

  5. #5
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Hai mai fatto un po' di teoria oo? Sai cos'è il polimorfismo? Sai a che differenza c'è tra un metodo Virtual e uno normale?
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  6. #6
    Si, una funzione virtuale è una funzione che viene sovrascritta dalla classe derivata. Non ricordo però la differenza tra funzione virtuale e funzione virtuale pura

  7. #7
    Ho optato per rendere getTipo una funzione virtuale pura. In compilazione però ottengo un warning che mi dice che Pezzo ha una funzione virtuale ma un distruttore non virtuale. Per il distruttore ho scritto soltanto:
    codice:
    ~Pezzo ();
    Non capisco dove stia il problema...

  8. #8
    Se il distruttore non è virtuale fare una delete di un oggetto della classe derivata tramite un puntatore a classe base è undefined behavior (tipicamente quello che succederà sarà che non viene eseguito il distruttore "vero" dell'oggetto eliminato più tutti quelli delle classi base, ma solo quello della classe base, oltre ad esserci potenziale per casini con l'allocatore di memoria). Di conseguenza, la maggior parte dei compilatori appena vedono che hai una classe con un metodo virtuale (=probabilmente la vuoi usare in maniera polimorfica) ma non un distruttore virtuale ti avvisano, visto che al 90% stai sbagliando.
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    Dunque dovrei rendere virtuale (puro?) anche il distruttore?

  10. #10
    Virtuale e basta. Non vuoi obbligare a ridefinire il distruttore, vuoi semplicemente che l'oggetto possa essere distrutto polimorficamente.
    Amaro C++, il gusto pieno dell'undefined behavior.

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.