Utiliza funciones virtuales cuando necesita manejar diferentes objetos de la misma manera. Se llama polimorfismo. Vamos a imaginar que tiene alguna clase de base - algo así como la forma clásica:
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 }
};
Ahora usted puede tener vectores de diferentes formas:
vector<Shape*> shapes;
shapes.push_back(new Rectangle());
shapes.push_back(new Circle());
y se puede extraer todas las formas de esta manera:
for(vector<Shape*>::iterator i = shapes.begin(); i != shapes.end(); i++)
{
(*i)->draw();
}
De esta manera está dibujando diferentes formas con un método virtual - draw(). La versión correcta del método se selecciona según la información del tiempo de ejecución sobre el tipo de objeto detrás del puntero.
Aviso Al utilizar las funciones virtuales se pueden declarar como virtual pura (como en la forma de clases, solo lugar "= 0" después proto método). En este caso, no podrá crear una instancia de objeto con función virtual pura y se llamará clase abstracta.
También observe "virtual" antes del destructor. En el caso de que esté planeando trabajar con objetos mediante punteros a sus clases base, debe declarar el destructor virtual, de modo que cuando llame a "eliminar" para el puntero de clase base, se invocará toda la cadena de destructores y no habrá pérdidas de memoria.
Creé una publicación de blog solo por este motivo, porque me resultó difícil explicarlo cuando un niño me preguntó "¿por qué funciones virtuales? http://nrecursions.blogspot.in/2015/06/so-why-do-we-need-virtual-functions.html – Nav