Si utilizzano le funzioni virtuali quando è necessario gestire oggetti diversi nello stesso modo. Si chiama polimorfismo. Immaginiamo di avere una certa classe di base - qualcosa come forma classica:
class Shape
{
public:
virtual void draw() = 0;
virtual ~Shape() {}
};
class Rectange: public Shape
{
public:
void draw() { // draw rectangle here }
};
class Circle: public Shape
{
public:
void draw() { // draw circle here }
};
Ora si può avere vettore di diverse forme:
vector<Shape*> shapes;
shapes.push_back(new Rectangle());
shapes.push_back(new Circle());
E si può trarre tutte le forme in questo modo:
for(vector<Shape*>::iterator i = shapes.begin(); i != shapes.end(); i++)
{
(*i)->draw();
}
In questo modo si disegnano forme diverse con un metodo virtuale: draw(). La versione corretta del metodo viene selezionata in base alle informazioni di runtime sul tipo di oggetto dietro il puntatore.
Avviso Quando si utilizzano le funzioni virtuali si possono dichiarare come puro virtuale (come in Forma di classe, solo luogo "= 0" dopo che il metodo proto). In questo caso non sarai in grado di creare istanze di oggetti con pura funzione virtuale e si chiamerà Classe astratta.
Notare anche "virtuale" prima del distruttore. Nel caso in cui pianifichi il lavoro con gli oggetti tramite puntatori alle loro classi base dovresti dichiarare il distruttore virtuale, quindi quando chiami "cancella" per il puntatore della classe base, verrà chiamata tutta la catena di distruttori e non ci saranno perdite di memoria.
fonte
2012-01-11 18:19:44
Ho creato un post di blog solo per questo motivo, perché ho trovato difficile spiegarlo quando un bambino mi ha chiesto "perché funzioni virtuali"? http://nrecursions.blogspot.in/2015/06/so-why-do-we-need-virtual-functions.html – Nav