Curso Profissional de Gestão e Programação de Sistemas Informáticos
Disciplina: Programação e Sistemas de Informação
Módulos 10 e 11 – POO
A professora: Sandra Soares
Classes em C++
Classes em C++Uma class define um novo tipo de dados
Class nome_identificador {
private: // dados e métodos não podem ser acedidos diretamente
dados e métodos;
protected: // dados e métodos só podem ser acedidos por classes derivadas
dados e métodos;
public: // dados e métodos podem ser acedidos diretamente
dados e métodos;
};
Classes em C++Uma definição de classe é em todo semelhante à definição de uma struct. Os dados são definidos como os campos de uma struct ou variáveis. Os métodos são definidos da mesma forma que funções.
Os dados e os métodos são acedidos e invocados, respetivamente, através do operador (.) ou “->” no caso do objeto ser um apontador.
Construtores Os construtores permitem a inicialização automática dasinstâncias. É permitida a definição de vários construtores deforma a disponibilizar um leque de inicializações possíveis.
O construtor é considerado o método especial, cujo nome éigual ao nome da classe.
Um construtor é invocado automaticamente quando édefinido um objeto de uma classe.
Construtores e construtores de classes derivadas
class base
{
private:
int a;
int b;
public:
base (int aa, int bb) { a=aa; b=bb;}
};
class derivada : public base
{
private:
int c;
public:
derivada (int aa, int bb, int cc) : base(aa,bb) { c=cc;}
};
void main(void)
{
base b1(1,2); //constrói um objeto da classe base
derivada d1(1,2,3); //constrói um objeto da classe derivada
}
Construtor da
classe base.
Construtor da
classe
derivada.
a e b são os parâmetros
da classe base que têm
que ser passados para a
classe derivada.
Classe-base – classe que serve de base à criação de outra classe;
Classe-derivada – classe que é criada a partir de outra classe.
Derivação de classes – criação de classes a partir de outras.
Herança – uma classe derivada herda, em princípio, todos os membros(variáveis ou atributos e funções ou métodos) da sua classe base.
Uma classe derivada, para ter razão de ser, deverá ter os seuselementos próprios, a nível de atributos e métodos (variáveis efunções), nuns casos, inteiramente novos, noutros casos, readaptadosda classe-base.
Uma classe derivada também pode servir de classe-base de uma outraclasse, logo podemos construir uma estrutura com vários níveis dehierarquia entre classes-base e derivadas – hierarquia de classes.
Derivação e herança entre classes
POOA derivação de classes com herança das classes-base e com as suas
características próprias, juntamente com a possibilidade de criarmos e
utilizarmos objetos de todas essas classes constitui, em traços gerais, a
essência da programação orientada para objetos.
Características fundamentais da POOEncapsulamento – tem a ver com a forma como a definição de umaclasse permite proteger o seu código e os seus dados. As vantagensdessa proteção são óbvias: as classes e os objetos constituem unidadesde código protegidas, flexíveis e reutilizáveis.
Polimorfismo – tem a ver com a possibilidade de criarmos diferentesversões para uma função ou operador; isto vem aumentar aflexibilidade e a possibilidade de readaptação desses elementos decódigo a novos contextos.
Herança – A derivação de classes com herança permite criar novasclasses a partir de outras já existentes; conjuntamente com issoreutilizam-se unidades de código já criadas e readaptam-se a novasfinalidades. Tudo isto junto permite a preparação de bibliotecas declasses que tornam a criação de aplicações mais fácil de rápida.
Criação de uma classe derivada: exemplo
Classe derivada Class D:[public|private|protected] B
A seguir ao nome da classe derivada inserem-se dois pontos(:),seguidos de um especificador de acesso (que pode ser: public; private;protected). Por fim, vem o nome da classe base.
As classes derivadas são criadas mais frequentemente com oespecificador public, pois, assim, essas classes herdam os membros daclasse-base com os mesmos qualificativos de public, private ouprotected e, além disso, os objetos da classe derivada podem ter acessoaos membros public da classe-base. As heranças com private eprotected são muito mais limitativas para as classes derivadas e objetos.
SituaçõesQuando uma classe derivada D é criada com public a partir de uma classe-baseB
◦ Os membros herdados da classe-base B mantêm, na classe derivada D, os mesmosqualificativos de public, private e protected;
◦ Os objetos da classe derivada D só têm acesso aos membros public da classe-base.
Quando uma classe derivada D é criada com protected a partir de uma classe-base B
◦ Os membros public e protected herdados da classe-base B passam todos a protectedna classe derivada D;
◦ Os objetos da classe derivada D não têm acesso a nenhum membro da classe-base.
Quando uma classe derivada D é criada com private a partir de uma classe-base B
◦ Os membros public e protected da classe-base B passam todos a private na classederivada D;
◦ Os objetos da classe derivada D não têm acesso a nenhum membro da classe-base.
Modalidades de acesso às classes com os especificadores public, private e protected
Hierarquia de classes
class Base
class Derivada1 : public Base
class Derivada2 : public Derivada1
…
Herança múltipla
class Base1 {…} class Base2 {…}
class Derivada : public Base1, public Base2
É possível criar uma classe derivada a partir
de mais do que uma classe base.
Herança múltiplaclass b1 {
…
};
class b2 {
…
};
class d: public b1, public b2 {
…
};
Herança múltipla
A classe derivada herda todos os membros das classes-base
mencionadas no seu cabeçalho e tem acesso direto a todos eles, exceto
em relação aos membros privados. Quanto aos objetos criados a partir
de uma classe derivada com herança múltipla, o acesso aos membros
das classes-base depende dos especificadores de acesso que foram
usados na criação da classe derivada.
Exemplo
Permissões de acesso
Tipo de Acesso Public Protected Private
Membros da mesma classe
Sim Sim Sim
Membros de classes derivadas
Sim Sim Não
Não membros Sim Não Não
Funções virtuais e sua redefinição em classes derivadas
Uma forma especial de redefinir uma função de uma classe-base em
classes derivadas passa pela utilização de funções virtuais. Uma função
virtual é uma função-membro de uma classe-base que é declarada com
a palavra virtual e tem de ser redefinida nas classes derivadas dessa
classe-base.
As funções virtuais constituem uma importante forma de polimorfismo
em C++. Elas permitem que as classes derivadas readaptem aos seus
contextos uma função membro da classe-base.
Função virtual pura e classe abstrataÉ possível declarar uma função virtual numa classe-base sem definiressa função, o que obriga a que toda a classe derivada tenha de ter asua versão da função virtual da classe-base.
Quando isto acontece, estamos perante aquilo que se chama umafunção virtual pura e uma classe abstrata.
Função virtual pura: é uma função que é declarada como virtual numaclasse-base e não recebe aí nenhuma definição, obrigando a que sejadefinida nas classes derivadas.
Classe abstrata: é uma classe que contém pelo menos uma funçãovirtual pura. Isto implica que uma classe abstrata não possa ser usadapara criar objetos a partir dela, uma vez que existe, pelo menos, ummembro não definido.
Função virtual pura e classe abstrataA forma geral para declarar uma função virtual pura é a seguinte:
virtual tipo_dados f_nome ([parâmetros])=0;
tipo_dados -> refere-se ao tipo de dados que a função retorna.
f_nome -> refere-se ao nome da função.
([parâmetros]) -> indica os eventuais parâmetros que a função pode utilizar.
A expressão = 0 é o indicativo que transforma a função em virtual pura (não é definida na classe base).
ExceçõesUma exceção ocorre quando um programa encontra-se numa situação anormal,
devido a condições que estão fora do seu controlo, tais como:
- memória insuficiente;
- erros de E/S;
- índice fora do intervalo permitido;
- etc…
Nessas ocasiões, a solução usualmente adotada consiste em exibir uma
mensagem de erro e interromper a execução do programa, devolvendo um
código de erro.
Exceções
Em C++, entretanto, podemos usar exceções para gerenciar de forma mais
eficaz os erros que ocorrem durante a execução de um programa. Em vez de
simplesmente abortar sua execução, podemos comunicar a ocorrência do
evento inesperado a um contexto de execução mais alto, que esteja melhor
capacitado para se recuperar da condição de erro.
ExemploPara lançar uma exceção a um nível mais alto de execução, usamos o comando throw:
try… catchUma exceção lançada é tratada depois, por um código que se encontra fora do
fluxo de execução normal do programa. Para tratar uma exceção, usamos a
seguinte estrutura:
Quando uma exceção é detetada dentro de um bloco try, os destrutores dos
objetos criados no bloco são chamados e, em seguida, o controle é transferido
ao bloco catch correspondente ao tipo da exceção detetada, se ele existir. No
final da execução do bloco catch, o programa continua a sua execução
normalmente, na primeira instrução após a estrutura try...catch.
Exemplo
Exemplo