AULA 10 - Programação II - Graduação
HERANÇA
É o processo pelo qual se cria novas classes, chamadas de SUB-CLASSES ou CLASSES DERIVADAS, baseadas em uma classe já existente, chamada de SUPER-CLASSE ou CLASSE-BASE.
A classe derivada “herda” todas as características da classe-base, além de poder incluir suas características próprias.
O maior objetivo do uso do mecanismo de herança é a REUTILIZAÇÃO DE CÓDIGO, para facilitar o desenvolvimento e também para criação de BIBLIOTECAS.
É preciso ter o arquivo de código-objeto da super-classe (não o arquivo-fonte).
Uma classe derivada só pode herdar características de uma única classe-base, mas podem ser feitas várias heranças sucessivas.
Sintaxe:
class NomeSubclasse: Modificador NomeSuperclasse
{ ...
Características próprias da subclasse
...
};
Exemplo:
Quando criamos um novo projeto no C++Builder, um formulário da classe TForm1 é criado.
Esta classe é, na verdade, uma herança da classe mais geral TForm:
class TForm1 : public TForm
{
...
};
Implementação da classe derivada:
Existem algumas particularidades na implementação de uma subclasse:
Construtor da classe derivada
Pode utilizar o construtor da classe base. Exs:
class Quadrado : public Retangulo
{ public:
Quadrado() : Retangulo() { ...}
Quadrado(int x1, int y1, int x2, int y2) : Retangulo(x1, y1, x2, y2) {...}
...
};
class Quadrado : public Retangulo
{ public:
Quadrado(int x1, int x2, int y1, int y2)
{
if(abs(x2 – x1) == abs(y2 – y1))
Retangulo::Retangulo(x1, y1, x2, y2);
else
ShowMessage(“Coordenadas inválidas para quadrado”);
...
};
Métodos da classe derivada também podem chamar métodos (públicos ou protegidos) da classe base usando a sintaxe
Classe_base::Método_classe_base( );
Se a classe derivada não possuir construtor – construtor da classe base é chamado.
Se este construtor da classe base não for default, ou não possuir valores default e não forem passados argumentos ⇒ ERRO!
Além de herança simples, uma classe pode ser derivada de mais de uma classe base ⇒ Herança múltipla!
Um método na classe derivada pode sobrecarregar um método da classe base : redefinir usando mesmo nome!
Ex:
class Quadrado : public Retangulo
{ public: // Métodos da classe base sobrecarregados na derivada:
long int Calcula_Area( );
long int Calcula_Perimetro( );
...
};
long int Quadrado::Calcula_Area( )
{ return(base*base); }
long int Quadrado::Calcula_Perimetro()
{ return(4*base); }
ESPECIFICADOR DE ACESSO PROTECTED:
As classes derivadas não têm acesso aos membros privados da classe base.
Para que as subclasses possam alterar atributos da superclasse, sem torná-los públicos: definí-los como protected.
Exemplo:
class Base {
public: int publico;
private: int privado;
protected: int protegido;
};
class Derivada : public Base
{ public: int a, b, c;
Derivada( ) {
a = publico; // Ok!
b = protegido; //Ok!
c = privado; } }; // ERRO!
EXERCÍCIO:
A partir da classe Pessoa derive as classes: Cliente - com os atributos particulares CPF, DataCompra, da classe Data e ValorCompra e com os métodos de inicialização e atualização destes atributos; Empregado - com os atributos particulares IdEmpresa, TotalVendas e Salario, os métodos de inicialização e atualização destes atributos, além de um método privado CalculaComissao( ). No código cliente, a partir da classe CadastraPessoa derive as subclasses CadastraCliente e CadastraEmpregado, para manter listas dinâmicas dos clientes e funcionários de uma loja.
