Publicado em Programação

Classes Derivadas – A Herança

A herança consiste numa relação entre duas classes, sendo uma criada a partir de outra já existente. Esta nova classe pode assim representar um conceito mais geral e herdar os membros da classe-base, cuja definição escusa de ser repetida.

A classe já existente designa-se de classe-base ou super-classe.

A nova classe designa-se de classe-derivada ou sub-classe.

Vou utilizar dois exemplos muito simples, baseados na definição de polígono e de triângulo.

#1 – Exemplo (sem derivação de classes)

Este é composto de três ficheiros:

  • Poligono.h
  • Poligono.cpp
  • main.cpp

Poligono.h

#ifndef POLIGONO_H
#define POLIGONO_H
#include <string>
using namespace std;
class Poligono{
//Definição Matemática
/*
Figura plana limitada por segmentos de recta, chamados lados dos polígonos
onde cada segmento de recta, intersecta exactamente dois outros extremos.
Exemplos de polígonos: http://pt.wikipedia.org/wiki/Polígono
*/
public:
Poligono();
void setNome(string novo_nome);
string getNome();
private:
string nome;
};
#endif    //POLIGONO_H

Poligono.cpp

#include "Poligono.h"

Poligono::Poligono(){nome="Não definido!";}

void Poligono::setNome(string novo_nome){nome = novo_nome;}

string Poligono::getNome(){return nome;}

main.cpp

#include <iostream>
#include "Poligono.h"
using namespace std;
int main(){
Poligono figura1;
figura1.setNome("Quadrilátero");
cout << figura1.getNome() << endl;
}

Observações

  • Ainda só estamos a utilizar uma classe, logo ainda não fica demonstrada a derivação de classes;
  • Esta classe define uma entidade “Polígono” sobre a qual apenas se preocupa em manipular o respectivo nome/designação.

#2 – Exemplo (com derivação de classes)

Este é composto de cinco ficheiros:

  • Triangulo.h (classe-derivada)
  • Triangulo.cpp
  • Poligono.h (classe-base)
  • Poligono.cpp
  • main.cpp

Triangulo.h

#ifndef TRIANGULO_H
#define TRIANGULO_H
#include "Poligono.h"
class Triangulo : public Poligono {
	//Definição Matemática
	/*
	 No plano, triângulo é a figura geométrica que ocupa o espaço interno
	 limitado por três linhas retas que concorrem, duas a duas, em três pontos
	 diferentes formando três lados e três ângulos internos que somam 180°.
	 */
public:
	Triangulo();
	void setLados(float new_lado1, float new_lado2, float new_lado3);
	float getLado1();
	float getLado2();
	float getLado3();
	float Perimetro();
private:
	float lado1;
	float lado2;
	float lado3;
};
#endif	//TRIANGULO_H

Triangulo.cpp

#include "Triangulo.h"

Triangulo::Triangulo(){
	lado1 = 1;
	lado2 = 1;
	lado3 = 1;
}

void Triangulo::setLados(float new_lado1, float new_lado2, float new_lado3){
	lado1 = new_lado1;
	lado2 = new_lado2;
	lado3 = new_lado3;
}

float Triangulo::getLado1(){return lado1;}

float Triangulo::getLado2(){return lado2;}

float Triangulo::getLado3(){return lado3;}

float Triangulo::Perimetro(){return lado1 + lado2 +lado3;}

main.cpp

#include <iostream>
#include "Triangulo.h"
using namespace std;
int main(){
	Triangulo figura1;
	figura1.setNome("Triângulo");
	figura1.setLados(10, 7,8);
	cout << "Nome : " << figura1.getNome() << endl;
	cout << "Comprimento do lado 1: " << figura1.getLado1() << endl;
	cout << "Comprimento do lado 2: " << figura1.getLado2() << endl;
	cout << "Comprimento do lado 3: " << figura1.getLado3() << endl;
	cout << "Soma dos comprimentos dos lados: " << figura1.Perimtro() << endl;
}

Poligono.h e Poligono.cpp

Utilizar exactamente os mesmos ficheiros apresentados no #1.

Observações

  • Reparem que no programa principal (main.cpp) a classe utilizada é a classe Triangulo (main.cpp – linha 2);
  • No programa principal (main.cpp – linha 6 ) é utilizado o método setNome(), que foi herdado da classe Poligono;
  • No programa principal (main.cpp – linha 8 ) é utilizado o método getNome(), que permiter obter o nome do objecto representado pela instância da classe Triangulo, que como se pode ver é um membro-dado da classe-base Poligono;
  • A declaração da derivação de classe é feita na linha 4 do ficheiro Triangulo.h;
  • A declaração da derivação de classe tem o seguinte formato:

x

class nome_da_classe_derivada : tipo_de_heranca nome_da_classe_base

x

Observações finais

Este foi o exemplo mais simples que me ocorreu para tentar explicar como se faz a derivação de classes. Como é óbvio muito fica ainda por dizer, mas penso que a ideia é esta!

Deixo o Diagrama de Classes que podem obter utilizando o Umbrello UML Modeller que mostra a relação entre as classes aqui criadas.

classdiagram01

Nota: O Diagrama foi criado com o Umbrello UML Editor que, à primeira vista, parece fantástico!

120px-umbrello-icon

Anúncios

5 opiniões sobre “Classes Derivadas – A Herança

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s