As classes abstratas estão projetadas para criar entidades generalizadas, cuja base, no futuro, prevê a criação de classes derivadas mais específicas. Uma classe abstrata é uma classe que pode ser utilizada apenas como classe base para alguma outra classe, por isso é impossível criar um objeto do tipo classe abstrata
Uma classe, que contenha pelo menos uma função meramente virtual, é abstrata. Portanto, as classes derivadas da classe abstrata devem implementar todas as suas funções meramente virtuais, caso contrário, elas serão também classes abstratas.
A função virtual é declarada como "pura" utilizando a sintaxe do especificador de pureza. Consideremos, como exemplo, uma classe CAnimal, criada apenas para fornecer funções comuns - são os próprios objetos do tipo CAnimal que têm um caráter demasiado geral para um uso prático. Assim, a classe CAnimal é uma boa candidata para classe abstrata:
class CAnimal
{
public:
CAnimal(); // construtor
virtual void Sound() = 0; // função meramente virtual (pura)
private:
double m_legs_count; // número de patas do animal
};
Aqui a função Sound() é meramente virtual, porque é declarada com o especificador da função meramente virtual PURE (=0).
São funções meramente virtuais apenas aquelas funções virtuais para as quais é exibido o especificador de pureza PURE, nomeadamente: (=NULL) ou (=0). Exemplo de declaração e utilização de uma classe abstrata:
class CAnimal
{
public:
virtual void Sound()=NULL; // PURE method, deve ser substituído no descendente, a própria classe CAnimal tornou-se abstrata e não pode ser criada
};
//--- descendente a partir da classe abstrata
class CCat : public CAnimal
{
public:
virtual void Sound() { Print("Myau"); } // PURE é substituída, classe CCat não é abstrata e pode ser criada
};
//--- exemplos de utilização incorreta
new CAnimal; // erro 'CAnimal' - compilador выдаст ошибку "não é possível instanciar classe abstrata"
CAnimal some_animal; // ошибка 'CAnimal' - компилятор выдаст ошибку "não é possível instanciar classe abstrata"
//--- exemplos de utilização correta
new CCat; // sem erros - a classe CCat não é abstrata
CCat cat; // sem erros - a classe CCat não é abstrata