THOUSANDS OF FREE BLOGGER TEMPLATES

quarta-feira, 14 de janeiro de 2009

MODULO 10 - classes derivadas - Herança

Neste começo de modulo começamos por falar de classes de derivadas, e dentro disso falamos de Herança
A herança é basicamente uma relação entre duas classes, sendo uma criada a partir de outra já existente.
A classe já existente designa-se de classe-base; A nova classe designa-se de classe-derivada.
Vou agora dar um pequeno exemplo:
Classe-base
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;
}


No programa
- É composto por 3 ficheiros
- o primeiro é onde a classe é criada.
- No segundo define-se o nome.
- No main ele chama as funçoes criadas em Poligono.cpp neste caso o nome (getNome)
Para compilar:
g++ -Wall main.cpp Poligono.cpp -o p
./p


Classe-derivada
Nota:A esta versão serão juntos os ficheiros criados atrás Poligono.cpp e Poligono.h

Triangulo.h
#ifndef TRIANGULO_H
#define TRIANGULO_H
#include "Poligono.h"
class Triangulo : public Poligono {

public:
Triangulo();
void setLados(float new_lado, float new_altura);
float getLado();
float getAltura();
float area();
float Perimetro();
private:
float lado;
float altura;
};
#endif

Triangulo.cpp
#include "Triangulo.h"

Triangulo::Triangulo(){
lado = 3;
altura = 3;

}

void Triangulo::setLados(float new_lado, float new_altura){
lado = new_lado;
altura= new_altura;

}

float Triangulo::getLado(){return lado;}

float Triangulo::getAltura(){return altura;}

float Triangulo::area(){return lado*altura/2;}

float Triangulo::Perimetro(){return lado+lado+lado;}



Rectangulo.h
#ifndef RECTANGULO_H
#define RECTANGULO_H
#include "Poligono.h"
class Rectangulo : public Poligono {

public:
Rectangulo();
void setLados(float new_lado1, float new_lado2, float new_comprimento, float new_largura);
float getLado1();
float getLado2();
float getComprimento();
float getLargura();
float area();
float Perimetro();
private:
float lado1;
float lado2;
float comprimento;
float largura;
};
#endif

Rectangulo.cpp
#include "Rectangulo.h"

Rectangulo::Rectangulo(){
lado1 = 3;
lado2 = 3;
comprimento = 3;
largura = 3;

}

void Rectangulo::setLados(float new_lado1, float new_lado2, float new_comprimento, float new_largura){
lado1 = new_lado1;
lado2 = new_lado2;
comprimento = new_comprimento;
largura = new_largura;
}

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

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

float Rectangulo::getComprimento(){return comprimento;}

float Rectangulo::getLargura(){return largura;}

float Rectangulo::area(){return comprimento*largura;}

float Rectangulo::Perimetro(){return lado1 + lado2 + comprimento + largura;}

Quadrado.h
#ifndef QUADRADO_H
#define QUADRADO_H
#include "Poligono.h"
class Quadrado : public Poligono {

public:
Quadrado();
void setLados(float new_lado);
float getLado();
float area();
float Perimetro();
private:
float lado;

};
#endif

Quadrado.cpp
#include "Quadrado.h"

Quadrado::Quadrado(){
lado = 3;


}

void Quadrado::setLados(float new_lado){
lado = new_lado;

}

float Quadrado::getLado(){return lado;}



float Quadrado::area(){return lado*lado;}

float Quadrado::Perimetro(){return lado + lado + lado + lado;}

Depois de isto criado iremos agora pôr o menu. Este Menu será substituido pelo main:
menu.cpp
#include <iostream>
#include "Triangulo.h"
#include "Quadrado.h"
#include "Rectangulo.h"
#include <stdlib.h>

using namespace std;
int main(void){
Triangulo figura1;
Quadrado figura2;
Rectangulo figura3;

char opcao;
cout<<"Escolha uma de 3 opçoes: (t)=Triangulo, (x)=Quadrado, (r)=Rectangulo"<<endl;
cin>>opcao;

do{

if(opcao == 't'){
figura1.setNome("Triângulo");
figura1.setLados(10,9);
cout << "Nome : " << figura1.getNome() << endl;
cout << "Comprimento de cada 1 dos 3 lados : " << figura1.getLado() << endl;
cout << "altura: " <<figura1.getAltura() << endl;
cout << "Soma dos comprimentos dos lados: " << figura1.Perimetro() << endl;
cout << "a area e: "<<figura1.area() <<endl;
cout<<"(q) para sair"<<endl;
cin>>opcao;
}

if(opcao == 'x'){
figura2.setNome("Quadrado");
figura2.setLados(4);
cout << "Nome : " << figura2.getNome() << endl;
cout << "Comprimento dos lados : " << figura2.getLado() << endl;
cout << "Soma dos comprimentos dos lados: " << figura2.Perimetro() << endl;
cout << "a area e: "<<figura2.area() <<endl;
cout<<"(q) para sair"<<endl;
cin>>opcao;
}

if(opcao == 'r'){
figura3.setNome("Rectangulo");
figura3.setLados(6,3,6,3);
cout << "Nome : " << figura3.getNome() << endl;
cout << "Comprimento do lado 1: " << figura3.getLado1() << endl;
cout << "Largura do lado 2: " << figura3.getLado2() << endl;
cout << "Comprimento da lado 3: " << figura3.getComprimento() << endl;
cout << "Largura do lado 4: " << figura3.getLargura() << endl;
cout << "Soma dos comprimentos dos lados: " << figura3.Perimetro() << endl;
cout << "a area e: "<< figura3.area() <<endl;
cout<<"(q) para sair"<<endl;
cin>>opcao;
}

}while(opcao != 'q');
return 0;
}


Para compilar:
g++ -Wall menu.cpp Poligono.cpp Quadrado.cpp Triangulo.cpp Rectangulo.cpp -o p
./p

No programa
- Sao criados 7 novos programas e substituidos 1 (main.cpp por menu.cpp)
- Nos programas criados sao feitas novas classes-derivadas do Poligono entre elas Triangulo.h/Triangulo.cpp
- Sao mostrados nos programas os lados e criadas areas e perimetros
- Depois no menu é criado um char opcao; essa opcao serve para mostrar na consola uma escolha a ser feita pelo utilizador (r)/(x)/(t) e um para fechar(q).

Para finalizar criamos um diagrama de classes deste programa feito no Umbrello UML Modeller:
Free Image Hosting at www.ImageShack.us

0 comentários: