[Análise detalhada do C ++] 37. Classes abstratas e interfaces em C ++

1 aula abstrata

1.1 Por que existem classes abstratas

Ao executar a análise orientada a objetos, haverá alguns conceitos abstratos.Como mostrado na figura abaixo, a classe retangular e a classe circular são subclasses da classe shape e todas elas têm uma função para encontrar a área. No entanto, faz sentido encontrar a área de uma forma específica e não faz sentido encontrar a área do "gráfico" conceitual!
Insira a descrição da imagem aqui
Os gráficos são apenas um tipo conceitual, não há objeto específico. No entanto, ainda há necessidade de gráficos.

A classe de gráficos aqui deve ser projetada como uma classe abstrata, usada para representar conceitos abstratos no mundo real.Não existem objetos específicos e as funções relacionadas não são totalmente implementadas, portanto, elas só podem ser herdadas e reescritas.

1.2 Classes abstratas e funções virtuais puras

Nós aprendemos funções virtuais no passado e elas são implementadas por meio da palavra-chave virtual. Sem fornecer a realização do corpo da função, diretamente "= 0" é uma função virtual pura

As regras de sintaxe são as seguintes:
Insira a descrição da imagem aqui
"= 0" informa ao compilador que atualmente está declarando uma função virtual pura, sem definir o corpo da função

Classe abstrata

  • Classes com funções virtuais puras são abstratas
  • Funções virtuais puras são funções membro que definem apenas protótipos, nenhuma implementação é fornecida
  • Uma função virtual pura se torna uma função virtual após ser implementada
  • Se a subclasse não implementar todas as funções virtuais puras, a subclasse ainda será uma classe abstrata
// 37-1.cpp
#include<iostream>
using namespace std;
class Shape
{
public:
    virtual double area() = 0;
};
class Rect : public Shape
{
public:
    Rect(int a, int b) : ma(a), mb(b) {}
    double area()
    {
        return ma * mb;
    }
private:
    int ma;
    int mb;
};
class Circle : public Shape
{
public:
    Circle(int r) : mr(r) {}
    double area()
    {
        return 3.14 * mr * mr;
    }
private:
    int mr;
};
void area(Shape* p)
{
    double s = p->area();
    cout << "area = " << s << endl;
}
int main()
{
    Rect rect(1, 2);
    Circle circle(10);
    area(&rect);
    area(&circle);
    return 0;
}

Shape é uma classe abstrata e não pode gerar objetos, o que evita a geração de objetos Shape sem conhecê-los, porque os objetos Shape não têm sentido. Depois que uma função virtual pura é implementada, ela se torna uma função virtual, que implementa o polimorfismo.Um objeto de uma subclasse de ponteiro de uma classe abstrata pode chamar dinamicamente funções-membro da subclasse de acordo com o tipo de objeto para encontrar a área de uma forma específica.

$ g++ 37-1.cpp -o 37-1
$ ./37-1
area = 2
area = 314

2 Interface

Classes C ++ que atendem às seguintes condições se tornam interfaces

  • Nenhuma variável é definida na classe
  • Todas as funções membro são funções virtuais puras e são públicas

Implementamos uma interface da seguinte maneira:

class Channel
{
public:
    virtual bool open() = 0;
    virtual void close() = 0;
    virtual bool send(char* buf, int len) = 0;
    virtual int receive(char* buf, int len) = 0;
};

Não há variáveis ​​de membro, apenas funções virtuais puras públicas.

3 Resumo

1. Classes abstratas são usadas para descrever conceitos abstratos no mundo real
2. Classes abstratas são implementadas por funções virtuais puras
3. Classes abstratas só podem ser herdadas e não podem criar objetos
4. Classes nas quais existem apenas funções virtuais puras são interfaces

Publicado 298 artigos originais · elogiou 181 · mais de 100.000 visualizações

Acho que você gosta

Origin blog.csdn.net/happyjacob/article/details/104432699
Recomendado
Clasificación