No, non è possibile in realtà ignorare la definizione nel genitore (almeno quando si parla di C++, "override" è normalmente riservato in modo specifico al riferimento alle funzioni virtuali). Invece, definendo una funzione con lo stesso nome nella classe figlio, semplicemente nasconde la funzione nella madre che ha lo stesso nome (cioè, nel contesto di un oggetto figlio, la ricerca di quel nome troverà la funzione solo nel bambino , non quello nel genitore).
Se si vuole (e le funzioni hanno diverse firme) è anche possibile ottenere le funzioni, sia il genitore e il bambino trattato come sovraccarico, quindi una chiamata cercherà di chiamare a seconda di quale corrisponde meglio:
struct parent {
void func1(char) {}
};
struct child : public parent {
void func1(long) { }
using parent::func1;
};
Ora, si ottiene:
child c;
c.func1('a'); // calls parent::func1
c.func1(123L); // calls child::func1
Questo è ancora un terzo tipo di comportamento, però, diverso dall'avere una funzione virtuale o avere una funzione nel bambino che nasconde quello nel genitore.
Con una funzione virtuale, la selezione di quale funzione viene chiamata si basa sul tipo dinamico, quindi se si ha un puntatore/riferimento alla classe base, la funzione chiamata dipende dal fatto che si riferisca ad un oggetto della base o classe derivata.
Quando si nasconde la funzione, la funzione chiamata è basata sul tipo statico, quindi se la si chiama tramite un puntatore/riferimento alla base, chiama la funzione di base, anche se in realtà si riferisce a un oggetto di la classe derivata. Se, tuttavia, si utilizza un puntatore o un riferimento a (o direttamente un'istanza di) la classe derivata, verrà richiamata la funzione nella classe derivata.
Con l'istruzione using
, si ottiene un sovraccarico della funzione, quindi quando si chiama la funzione (nel contesto della classe derivata) la funzione chiamata si basa sulla firma della funzione che è la migliore corrispondenza per il/i parametro/i passaggio.
È possibile eseguire l'override, ma l'uso di puntatori/riferimenti di classe di base per il proprio figlio non darebbe un comportamento polimorfico. – birryree
Risposta semplice: No! Altrimenti la parola chiave virtual è senza senso. – knivil
@knivil: È possibile, e la parola chiave 'virtuale' ha un significato - sta solo facendo qualcos'altro [il comportamento cambierà completamente!], È * nascondendo *' func1() 'nella superclasse, e non attivando la dinamica spedizione. – amit