Una funzione che si conclude in un =0
è chiamato deleted function
, questo è utile quando non si desidera che gli oggetti che utilizzano alcuni costruttori (come ad esempio unique_ptr
che ha un ctor copia eliminata).
Se una funzione virtual
viene cancellata, la classe diventa di tipo astratto per standard. Poiché nella maggior parte dei casi il prototipo di una classe e i corpi delle funzioni della classe si trovano in file separati, ciò significa che, a meno che non specifichi esplicitamente nel prototipo che stai ignorando la funzione virtuale eliminata, NON stai sovrascrivendo la funzione virtuale eliminata. Il compilatore non dovrebbe semplicemente dedurre semplicemente che intendevi inserire la funzione una volta che vede l'implementazione in un file completamente diverso.
Ricordare che l'idea di prototipo/implementazione non è l'unico modo per scrivere codice, è anche possibile inserire l'implementazione direttamente nella classe (che può essere eseguita se il codice è abbastanza piccolo e si desidera incorporare la funzione.) E per fare ciò è necessario, di nuovo, sovrascrivere esplicitamente la funzione virtuale eliminata. Quindi, poiché è necessario sovrascriverlo in ogni caso, è perfettamente logico che sia necessario sovrascriverlo esplicitamente nel prototipo. La funzione è ancora cancellata in caso contrario.
Per un esempio concreto: supponiamo di avere un List.hpp, List.cpp e main.cpp
In List.hpp si dispone di una classe astratta e una classe normale che eredita dalla classe astratta. In main è #include "List.hpp"
e non List.cpp, giusto? Quindi il compilatore NON ha IDEA in quel file (fino a quando non tenta di compilarlo). Se non si ha la funzione virtuale eliminata sovrascritta, il compilatore pensa che si stia semplicemente tentando di creare un'istanza di una classe astratta e di generare un errore.
D'altra parte, se si sta compilando List.cpp, anche il compilatore genererà un errore, questa volta lamentandosi che la funzione che si sta tentando di scrivere non sia stata effettivamente definita. Perché Base::deletedFunction()
è diverso da Derived::deletedFunction()
.
hai riassunto molto meglio :) –
Sono d'accordo, questo è probabilmente più comprensibile della mia risposta vagante, +1. – OmnipotentEntity
Se la classe derivata è astratta o non può essere conosciuta con una parola chiave "astratta" esplicita che manca in C++. –