Вы находитесь на странице: 1из 29

05/04/2011

1
POO e C++: Herana e
Polimorfismo
Mrcio Santi
Luiz Fernando Martha
Conceito de Herana em POO
Recurso que torna o conceito de classe mais
poderoso;
Permite que se construa e estenda
continuamente classes desenvolvidas, mesmo
por outras pessoas;
Projeto OO: o objetivo desenvolver classes que
modelem e resolvam um determinado problema;
Com o mecanismo de herana essas classes
podem ser desenvolvidas incrementalmente a
partir de classes bsicas simples.
05/04/2011
2
Conceito de Herana em POO
Classe Bsica
Classe Derivada
Conceito de Herana em POO
Cada vez que se deriva uma nova classe, a
partir de uma j existente, pode-se herdar
algumas ou todas as caractersticas da classe
pai (bsica);
comum projetos em POO apresentarem at
centenas de classes, sempre derivadas de um
subconjunto pequeno de classes bsicas;
05/04/2011
3
Conceito de Herana em C++
Conceito de Herana em C++
Os mtodos herdados so usados exatamente
como os no herdados;
Em nenhum trecho do cdigo foi necessrio
mencionar que os mtodos Caixa::Altura e
Caixa::Largura foram herdados
O uso de um recurso de uma classe no
requer saber se este foi ou no herdado;
Essas caractersticas podem ser traduzidas por
flexibilidade para o programador;
05/04/2011
4
Conceito de Herana em C++
O que no herdado:
Construtores;
Destrutores;
Operadores new;
Operadores de atribuio;
Relacionamentos friend;
Atributos privados.
Membros de Classe protected
Alm dos especificadores de acesso j
apresentados: public e private, existe um outro
especificador relacionado estritamente ao
conceito de herana: protected
Um atributo protected funciona como private sob
o ponto de vista externo a classe;
A diferena que atributos protected so visveis
pelas classes derivadas, enquanto os private no
o so;
Essas caractersticas podem ser traduzidas por
flexibilidade para o programador;
05/04/2011
5
Membros de Classe Protected
Herana: Construtores e Destrutores
Quando uma classe instanciada, o seu
construtor chamado. Se a classe for derivada
de alguma outra, o construtor da classe base
chamado anteriormente;
Se a classe base tambm derivada de outra,
o processo repetido recursivamente at que
uma classe no derivada seja alcanada;
Isso fundamental para se manter
consistncia para o objeto recm criado;
05/04/2011
6
Herana: Construtores e Destrutores
Herana: Construtores e Destrutores
05/04/2011
7
Herana: Construtores e Destrutores
Se uma classe base no possui um construtor
sem parmetros, a classe derivada tem que,
obrigatoriamente, declarar um construtor,
mesmo que esse construtor seja vazio:
Herana: Construtores e Destrutores
05/04/2011
8
Herana: Pblica x Privada
Por default as heranas so private. por isso
que nos exemplos acima especificou-se
sempre as classes em herana da seguinte
forma: class B : public A {...}
Herana Privada: todos os atributos herdados
tornam-se private na classe derivada;
Herana Pblica: Os atributos public e
protected assim permanecem na classe
derivada;
Conceito de Polimorfismo em POO
Polimorfismo = poli + morphos
Polimorfismo descreve a capacidade de um
cdigo de programao comportar-se de
diversas formas dependendo do contexto;
um dos recursos mais poderoso de
linguagens orientadas a objetos:
Permite trabalhar em um nvel alto de abstrao;
Facilita a incorporao de novos pedaos em um
sistema existente;
05/04/2011
9
Conceito de Polimorfismo em C++
A
B
EM C++ polimorfismo se d atravs da
converso de ponteiros (ou referncias)
Utiliza-se objetos em hierarquia de
classes:
Conceito de Polimorfismo em C++
Como B derivado de A, todos os membros disponveis em A
tambm estaro em B;
B um super-conjunto de A: todas as operaes que podem
ser feitas com objetos de A tambm o podem atravs de
objetos de B;
Um objeto da classe B tambm um objeto da classe A: isso
significa a possibilidade de se converter um objeto de B para A
A A
B
05/04/2011
10
Conceito de Polimorfismo em C++
A
B
A A
B
a b
Polimorfismo em C++
05/04/2011
11
Polimorfismo: Redefinio de
Mtodos em uma Hierarquia
E se definssemos dois mtodos com mesmo
nome nas classes A e B ?
No existe sobrecarga em uma hierarquia;
A definio de mtodos com mesmo nome em
classes bsica e derivada no os deixa
disponveis, mesmo com assinaturas distintas;
A ltima definio esconde a anterior;
Continuam acessveis, mas no de forma
direta;
Polimorfismo: Redefinio de
Mtodos em uma Hierarquia
05/04/2011
12
Polimorfismo: Redefinio de
Mtodos em uma Hierarquia
possvel tambm declarar um mtodo com mesmos
nome e assinatura nas classes base e derivada:
Polimorfismo: Redefinio de
Mtodos em uma Hierarquia
A funo chamaf pode ser usada para
qualquer objeto da classe A e derivados;
No exemplo acima ela chamada com um
objeto do tipo B. O mtodo f chamado no
corpo de chamaf;
Qual verso ser executada ?
A::f();
B::f();
Era esse o comportamento desejado ?
05/04/2011
13
Polimorfismo: Redefinio de
Mtodos em uma Hierarquia
Polimorfismo: Redefinio de
Mtodos em uma Hierarquia
05/04/2011
14
Polimorfismo: Redefinio de
Mtodos em uma Hierarquia
A funo manipula_lista utiliza apenas os
mtodos add e remove;
Qual o resultado que este programa vai imprimir
na tela ?
a lista lb contm 0 elementos.
Os mtodos chamados sero List::Add e
List::Remove, que no alteram a varivel n;
A manipulao deixou o objeto inconsistente
internamente;
Isso s seria possvel caso os mtodos chamados
fossem ListN::Add e ListN::Remove
Early Binding / Late Binding
Early Binding (EB): ligao dos identificadores
em tempo de compilao;
Late Binding (LB): ligao que permite a
amarrao dos identificadores em tempo de
execuo do programa;
Para todos os exemplos apresentados at
aqui, todas as amarraes de funes e
mtodos foram feitas em tempo de
compilao (early binding);
05/04/2011
15
Early Binding / Late Binding
O problema de EB que o programador
precisa saber quais objetos sero usados para
as chamadas dos seus mtodos;
Linguagens convencionais como C, FORTRAM,
PASCAL s utilizam EB;
A vantagem de EB a eficincia
computacional;
Early Binding / Late Binding
eficincia flexibilidade
E
B
LB
05/04/2011
16
Linguagem C++: Hbrida
C++ no uma linguagem procedural
tradicional, mas tambm no uma
linguagem orientada a objetos pura: uma
linguagem hbrida;
C++ oferece EB e LB: o programador controla
quando usa um ou o outro;
A vantagem de EB a eficincia
computacional;
Polimorfismo: Mtodos Virtuais
Em C++, LB especificado declarando-se um
mtodo como virtual. LB s faz sentido para
objetos que fazem parte de uma hierarquia de
classes;
Se um mtodo f declarado virtual em uma
classe Base e redefinido na classe Derivada,
qualquer chamada a f a partir de um objeto do
tipo Derivada, mesmo via um ponteiro para Base,
executar Derivada::f;
A redefinio de um mtodo virtual tambm
virtual (implcita e explicitamente);
05/04/2011
17
Polimorfismo: Mtodos Virtuais
Polimorfismo: Destrutores Virtuais
05/04/2011
18
Classes Abstratas
Classes abstratas esto em um nvel
intermedirio entre especificao e cdigo de
programao;
Uma classe abstrata quase uma
especificao; ao mesmo tempo um
elemento da linguagem de programao;
Estas classes permitem a definio das
interfaces dos objetos sem entrar em detalhes
de implementao;
Classes Abstratas em C++
Em C++, classes abstratas so aquelas que
apresentam ao menos um mtodo virtual puro;
C++ permite que uma classe apresente mtodos
sem implementao;
Mtodos sem implementao so sempre virtuais
Mtodos definidos em uma classe sem
implementao, apenas com a definio de sua
assinatura, denominado mtodo virtual puro;
05/04/2011
19
Classes Abstratas: mtodos
virtuais puros
um mtodo virtual puro em C++ definido
definindo-o como virtual e atribuindo-lhe o valor
zero:
Uma classe abstrata no pode ter um objeto
instanciado diretamente. necessria a definio de
uma classe derivada com a implementao de todos
os mtodos definidos na classe abstrata como
virtuais puros.
Classes Abstratas: mtodos
virtuais puros
05/04/2011
20
Classes Abstratas: Motivao
Especificao de interface, ou herana de tipo;
Manipulao de objetos utilizando o recurso de
polimorfismo;
Nesse caso pode-se definir classes genricas para
representar um super-conjunto de sub-classes, que
por sua vez vo representar os objetos instanciados;
Veculo
Carro Onibus Moto Caminho
Classes Abstratas: Trabalho
Shape
Circle Polygon
05/04/2011
21
Classes Abstratas: Trabalho
(Classe Model)
Classes Abstratas: Exemplos
Os objetos podem ser acessados sempre partindo-se do ponteiro para
objetos da classe bsica e os recursos de polimorfismo e LB permitem
que o programador faa chamadas dos mtodos sem saber para que
tipo este endereo de memria est apontando;
?
05/04/2011
22
Classes Abstratas: Exemplos
Classes Abstratas: Exemplos
05/04/2011
23
Classes Abstratas: Exemplos
Classes Abstratas: Exemplos
05/04/2011
24
Classes Abstratas: Exemplos
Classes Abstratas: Exemplos
05/04/2011
25
Classes Abstratas: Exemplos
Tabela de Mtodos Virtuais
Ponteiro de Funes
05/04/2011
26
Tabela de Mtodos Virtuais
Ponteiro de Funes
Tabela de Mtodos Virtuais
Ponteiro de Funes
05/04/2011
27
Tabela de Mtodos Virtuais
Como C++ implementa o LB ?
Tabela de Mtodos Virtuais
A funo chamaf executar o mtodo f do
objeto passado como parmetro;
Dependendo do tipo do objeto, a mesma linha
executar A::f ou B::f. como se a funo
fosse implementada assim:
05/04/2011
28
Tabela de Mtodos Virtuais
Mas se na realidade fosse assim no teramos o
comportamento desejado:
Cada classe derivada de A precisaria de um case
dentro do switch;
Esta funo no poderia ser utilizada com as futuras
classes derivadas;
Quanto mais classes, pior seria a eficincia;
O compilador no tem como saber o que seria
derivado de A no futuro
Concluso: essa implementao irreal.
Tabela de Mtodos Virtuais
Na realidade o que C++ utiliza uma tabela de
mtodos virtuais (TMV);
TMV so nada mais que vetores de ponteiros de
funes;
O nmero de entradas da tabela igual ao
nmero de mtodos virtuais da classe e cada
posio guarda o ponteiro para uma funo
virtual;
Quando uma classe contm algum mtodo
virtual, todos os seus objetos contero uma
referncia para essa tabela;
05/04/2011
29
Tabela de Mtodos Virtuais
Tabela de Mtodos Virtuais
No exemplo em questo, existem duas tabelas virtuais: uma para a
classe A e outra para B;
A tabela de A tem duas posies, uma para cada mtodo virtual. A
tabela de B tem uma posio a mais para o mtodo h.
A posio dos mtodos na tabela sempre a mesma, ou seja, se na
tabela de A a primeira posio apontar para o mtodo f, em todas
as classes derivadas a primeira posio ser de f.
Na tabela de A, este ponteiro aponta para A::f, enquanto que em B
ele aponta para B::f.
Quando acontece alguma chamada no cdigo, a funo no
chamada pelo nome, e sim por indexao a esta tabela.
Em qualquer tabela de classes derivadas de A o mtodo f estar na
mesma posio, no caso, a primeira: