AULA 10 - Programação II - Graduação

De IFSC
Revisão de 10h00min de 18 de abril de 2018 por imported>Fargoud (→‎Construtor da classe derivada)
Ir para navegação Ir para pesquisar

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.

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!

PRGheranca.png

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.