Non è necessario contrassegnarli come virtuali.
Inizierei sostenendo che la pubblicità virtuale ai lettori prevede che le classi derivate ignorino il virtuale per fare qualcosa di utile. Se stai implementando il virtual per fare qualcosa, allora il metodo virtuale potrebbe non avere nulla a che fare con il tipo di cosa che è la tua classe: nel qual caso contrassegnarlo virtuale è sciocco. prendere in considerazione:
class CommsObject {
virtual OnConnect();
virtual OnRawBytesIn();
};
class XMLStream : public CommsObject {
virtual OnConnect();
OnRawBytesIn();
virtual OnXMLData();
};
In questo esempio, OnConnect è documentato come virtuale in entrambe le classi, perché ha senso che un discendente sarebbe sempre vogliono sapere. OnRawBytesIn non ha senso "Esportare" da XMLStream poiché lo utilizza per gestire i byte non elaborati e generare dati analizzati, che vengono notificati tramite OnXMLData().
Dopo aver fatto tutto questo, avrei allora sostengo che il manutentore di un 3 ° di classe, guardando XMLStream, potrebbe pensare che sarebbe stato "sicuro" per creare la propria funzione OnRawBytes e si aspettano di lavorare come un normale sovraccarico funzione - cioè la classe base chiamerebbe quella corretta interna e quella esterna maschererebbe gli OnRawByte interni.
Così omettere il virtuale ha nascosto dettagli importanti ai consumatori della classe e ha comportato il codice in modo inaspettato.
Così Ive andato cerchio completo: Non cercare di usarlo come un suggerimento in merito alla destinazione di una funzione - ne fanno uso come un suggerimento circa il comportamento della funzione: Funzioni marchio virtuali programmatori costantemente così a valle devono lettura meno file di sapere come una funzione si comporterà quando ignorato.
fonte
2010-10-26 14:26:47
A meno che non venga utilizzato come parte di una libreria. –