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.
