Когда удобно использовать абстрактные классы.

#include <QtCore/QCoreApplication>
#include <QDebug>
class Abstract
{
public:
virtual void echo()=0;
};
class A1: public Abstract
{
public:
void echo()
{
qDebug() << "class A1";
}
};
class A2: public Abstract
{
public:
void echo()
{
qDebug() << "class A2";
}
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
A1 cl1;
A2 cl2;
cl1.echo();
cl2.echo();
QMap<int, Abstract*> mm;
mm.insert(0,new A1());
mm.insert(1,new A2());
foreach(Abstract* cla, mm)
{
cla->echo();
}
return a.exec();
}
Тут вся прелесть в том , что в результате мы имеем массив указателей однотипных объектов mm.
Однотипно вызываем функцию echo для абстрактного общего класса A, а выполняется функция конкретного наследуемого класса , где реализована специфика поведения конкретного объекта.

Смотрите еще по теме виртуальный деструктор .
И виртуальное множественное наследование.