Само слово abstract в качестве операторов, директив и т.д. в с++ не встречается, а встречается оператор virtual.
Так вот virtual обозначает, что класс внутри которого объявлена функция с virtual и становится абстрактным. Но, что это значит?...
А оказывается это очень мощная парадигма или технология оптимизации кода с умным английским названием полиморфизм, которым можно объяснить все, любое явление в природе.
Но на самом деле если один раз попробовать виртуальные функции, то потом за уши не оттащищь, настолько удобная это штуковина.
А приходит понимание необходимости абстракных классов, когда у вас появляется 2 и более однотипных объектов, которыми надо управлять однотипно. Но не писать же почти одинаковый код дважды, трижды и т.д.
Небольшой короткий пример, когда удобно использовать абстрактные классы.

#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, а выполняется функция конкретного наследуемого класса , где реализована специфика поведения конкретного объекта.

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