Carlos Eduardo Batista Centro de Informática -UFPB bidu@ci...

26
Linguagem de Linguagem de Programação I Programação I Programação I Programação I Carlos Eduardo Batista Centro de Informática - UFPB [email protected]

Transcript of Carlos Eduardo Batista Centro de Informática -UFPB bidu@ci...

Page 1: Carlos Eduardo Batista Centro de Informática -UFPB bidu@ci ...wiki.cbatista.net/lib/exe/fetch.php/lpi-aula10... · Herança e composição: diferentes formas de se utilizar ‘blocos’

Linguagem de Linguagem de Programação IProgramação IProgramação IProgramação I

Carlos Eduardo Batista

Centro de Informática - [email protected]

Page 2: Carlos Eduardo Batista Centro de Informática -UFPB bidu@ci ...wiki.cbatista.net/lib/exe/fetch.php/lpi-aula10... · Herança e composição: diferentes formas de se utilizar ‘blocos’

� Herança e composição em C++

C++ e POOC++ e POO2

Page 3: Carlos Eduardo Batista Centro de Informática -UFPB bidu@ci ...wiki.cbatista.net/lib/exe/fetch.php/lpi-aula10... · Herança e composição: diferentes formas de se utilizar ‘blocos’

Carro

private:String modelo;String chassis;Motor m;

public:liga();

EncapsulamentoEncapsulamento3

liga();acelera(int);freia(int);private:liberaCombustivel(int);freioABS(int);

Page 4: Carlos Eduardo Batista Centro de Informática -UFPB bidu@ci ...wiki.cbatista.net/lib/exe/fetch.php/lpi-aula10... · Herança e composição: diferentes formas de se utilizar ‘blocos’

� Hierarquia de classes

� Classes mais especializadas herdam das mais genéricas

� Atributos e métodos são herdados

� Classe filha é um “tipo de” Classe Pai

HerançaHerança4

Page 5: Carlos Eduardo Batista Centro de Informática -UFPB bidu@ci ...wiki.cbatista.net/lib/exe/fetch.php/lpi-aula10... · Herança e composição: diferentes formas de se utilizar ‘blocos’

� Herança simples

� Composição

� Combinando composição e herança

� Herança múltipla (!!!)

� Polimorfismo e funções virtuais

� Classes abstratas

Herança e composiçãoHerança e composição5

Page 6: Carlos Eduardo Batista Centro de Informática -UFPB bidu@ci ...wiki.cbatista.net/lib/exe/fetch.php/lpi-aula10... · Herança e composição: diferentes formas de se utilizar ‘blocos’

� Vantagem: mecanismos para reuso de código

� Herança e composição: diferentes formas de se utilizar ‘blocos’ de código ◦ Mais possibilidades que as oferecidas por linguagens procedurais

� Herança versus composição

Herança e composiçãoHerança e composição

� Herança versus composição

6

Page 7: Carlos Eduardo Batista Centro de Informática -UFPB bidu@ci ...wiki.cbatista.net/lib/exe/fetch.php/lpi-aula10... · Herança e composição: diferentes formas de se utilizar ‘blocos’

Polígono

Cor c;

desenhar();apagar();definirCor(Cor c);area();

Retângulo Triângulo

HerançaHerança7

Retângulo

desenhar();apagar();area();

desenhar();apagar();area();

Círculo

desenhar();apagar();area();

Page 8: Carlos Eduardo Batista Centro de Informática -UFPB bidu@ci ...wiki.cbatista.net/lib/exe/fetch.php/lpi-aula10... · Herança e composição: diferentes formas de se utilizar ‘blocos’

Carro

private:String modelo;String chassis;Motor m;SistemaFreio f;

public:

ComposiçãoComposição8

public:liga();acelera(int);freia(int);private:liberaCombustivel(int);freioABS(int);

Page 9: Carlos Eduardo Batista Centro de Informática -UFPB bidu@ci ...wiki.cbatista.net/lib/exe/fetch.php/lpi-aula10... · Herança e composição: diferentes formas de se utilizar ‘blocos’

� X “é um tipo de” Y◦ Cachorro é um tipo de mamífero

◦ Mamífero é um tipo de animal

◦ Ave é um tipo de animal

� Interface comum entre subclasses de uma mesma classe

Herança simplesHerança simples9

Page 10: Carlos Eduardo Batista Centro de Informática -UFPB bidu@ci ...wiki.cbatista.net/lib/exe/fetch.php/lpi-aula10... · Herança e composição: diferentes formas de se utilizar ‘blocos’

Animal

int idade;

come()dorme()

Ave

botaOvo()

Mamífero

mama()

Herança simplesHerança simples10

Cachorro

late()morde()

Curió

canta()voa()

Page 11: Carlos Eduardo Batista Centro de Informática -UFPB bidu@ci ...wiki.cbatista.net/lib/exe/fetch.php/lpi-aula10... · Herança e composição: diferentes formas de se utilizar ‘blocos’

� Atributos privados da classe base (pai) não são acessíveis nas subclasses (filhas)◦ Acesso indireto através de funções públicas das

classes base

� Herança pública◦ class Y : public X {};

� Métodos públicos de X também serão públicos em Y

� Y tem a mesma interface de X

Herança simplesHerança simples

� Y tem a mesma interface de X

� Y é um tipo de X

� Herança privada◦ class Y : X { };

� O que era público em X é privado em Y

� Y não é um tipo de X

11

Page 12: Carlos Eduardo Batista Centro de Informática -UFPB bidu@ci ...wiki.cbatista.net/lib/exe/fetch.php/lpi-aula10... · Herança e composição: diferentes formas de se utilizar ‘blocos’

� Métodos herdados podem ser sobrescritos

class Animal {int idade;

public:Animal(int id) :idade(id) {}void come();void dorme();

};

Herança simplesHerança simples12

};class Ave: public Animal {

string nome;public:

Ave(int, const string&);void dorme();

};

Page 13: Carlos Eduardo Batista Centro de Informática -UFPB bidu@ci ...wiki.cbatista.net/lib/exe/fetch.php/lpi-aula10... · Herança e composição: diferentes formas de se utilizar ‘blocos’

� Utilização de objetos de classes existentescomo membros (atributos) de outrasclasses◦ A nova classe é composta de objetos de classes existentes Carro

Motor m;SistemaFreio f;Roda r[4];

ComposiçãoComposição13

Roda r[4];

anda()para()

Motor

acelera()

Roda

gira()

SistemaFreio

freia()

4

1

1

Page 14: Carlos Eduardo Batista Centro de Informática -UFPB bidu@ci ...wiki.cbatista.net/lib/exe/fetch.php/lpi-aula10... · Herança e composição: diferentes formas de se utilizar ‘blocos’

class Roda { };class Motor { };class SistemaFreio { };class Carro {vector <Roda> r;Motor m;SistemaFreio f;

ComposiçãoComposição14

SistemaFreio f;public: ...};

Page 15: Carlos Eduardo Batista Centro de Informática -UFPB bidu@ci ...wiki.cbatista.net/lib/exe/fetch.php/lpi-aula10... · Herança e composição: diferentes formas de se utilizar ‘blocos’

� Inicialização dos objetos é feita no construtor da classe que os contém

class Roda {double raio;

public:Roda(double r) : raio(r) {}

};

class Motor {double pot;

public:

class Carro {vector<Roda> rodas;Motor mot;SistemaFreio fre;

public:Carro (double r, double p, int n)

: rodas(4, Roda(r)) , mot(p), fre(n) {}};

ComposiçãoComposição15

public:Motor(double p): pot (p) { }

};

class SistemaFreio {int numSerie;

public:SistemaFreio(int n): numSerie(n) { }

};

int main() {Carro c1(10., 20., 234225);return 0;

}

Page 16: Carlos Eduardo Batista Centro de Informática -UFPB bidu@ci ...wiki.cbatista.net/lib/exe/fetch.php/lpi-aula10... · Herança e composição: diferentes formas de se utilizar ‘blocos’

� Novas classes podem ser formadasutilizando composição e herançaclass A {int i;

public:A(int ii) : i(ii) {}~A() {}void f() const {}

};

class C : public B {A a;

public:C(int ii) : B(ii), a(ii) {}~C() {} // chama ~B e ~Avoid f() const {

ComposiçãoComposição16

};class B {int i;

public:B(int ii) : i(ii) {}~B() {}void f() const {}

};

void f() const {a.f();B::f(); }};int main() {C c(47); }

Page 17: Carlos Eduardo Batista Centro de Informática -UFPB bidu@ci ...wiki.cbatista.net/lib/exe/fetch.php/lpi-aula10... · Herança e composição: diferentes formas de se utilizar ‘blocos’

� Quando objetos das classes derivadasdeixam seu escopo, os métodosdestrutores são chamados ao longo da hierarquia◦ Ordem inversa à ordem dos construtores

OrdemOrdem de de chamadachamada de de destrutoresdestrutores17

Page 18: Carlos Eduardo Batista Centro de Informática -UFPB bidu@ci ...wiki.cbatista.net/lib/exe/fetch.php/lpi-aula10... · Herança e composição: diferentes formas de se utilizar ‘blocos’

� Ambas permitem reuso de código� Herança

◦ Características da classe base estão na interface da classe filha

◦ Classe filha é tipo da classe base� Subtipagem

� Composição◦ Classe contém as características das classes

HerançaHerança e/e/ouou composiçãocomposição

◦ Classe contém as características das classes utilizadas na composicão

◦ Essas características geralmente não aparecem na interface� Só se membro for público

18

Page 19: Carlos Eduardo Batista Centro de Informática -UFPB bidu@ci ...wiki.cbatista.net/lib/exe/fetch.php/lpi-aula10... · Herança e composição: diferentes formas de se utilizar ‘blocos’

� Herança privada◦ o que era público na classe base passa a ser privado na classe derivada

◦ A classe derivada é implementada em termos da classe base, e não é um tipo da classe base

◦ Pode-se expor alguns nomes na interface pública utilizando-se a palavra chave using

19

Page 20: Carlos Eduardo Batista Centro de Informática -UFPB bidu@ci ...wiki.cbatista.net/lib/exe/fetch.php/lpi-aula10... · Herança e composição: diferentes formas de se utilizar ‘blocos’

class Pet {public:

char eat() const { return 'a'; }int speak() const { return 2; }float sleep() const { return 3.0; }float sleep(int) const { return 4.0; }

};class Goldfish : Pet { // Private inheritancepublic:

using Pet::eat; // Name publicizes memberusing Pet::sleep; // Both overloaded members expose d

};int main() {

HerançaHerança privadaprivada20

Goldfish bob;bob.eat();bob.sleep();bob.sleep(1);

//! bob.speak();// Error: private}

Page 21: Carlos Eduardo Batista Centro de Informática -UFPB bidu@ci ...wiki.cbatista.net/lib/exe/fetch.php/lpi-aula10... · Herança e composição: diferentes formas de se utilizar ‘blocos’

� Especificadores de acesso◦ public

◦ private

◦ protected

� Herança◦ Algo privado para os usuários da classe, mas acessível para os membros da própria

AtributosAtributos protegidosprotegidos

mas acessível para os membros da própriaclasse e de suas classes derivadas� Encapsulamento protected

21

Page 22: Carlos Eduardo Batista Centro de Informática -UFPB bidu@ci ...wiki.cbatista.net/lib/exe/fetch.php/lpi-aula10... · Herança e composição: diferentes formas de se utilizar ‘blocos’

include <fstream>using namespace std;class Base {

int i;protected:int read() const { return i; }

void set(int ii) { i = ii; }public:

Base(int ii = 0) : i(ii) {}int value(int m) const { return m*i; }

};

class Derived : public Base {int j;

AtributosAtributos protegidosprotegidos22

int j;public:

Derived(int jj = 0) : j(jj) {}void change(int x) { set(x); }

};int main() {Derived d;

d.change(10);}

Page 23: Carlos Eduardo Batista Centro de Informática -UFPB bidu@ci ...wiki.cbatista.net/lib/exe/fetch.php/lpi-aula10... · Herança e composição: diferentes formas de se utilizar ‘blocos’

� Implementar hierarquia de classes exibidano diagrama do slide 13◦ Usar composição

◦ Usar herança (incrementar)

◦ Usar encapsulamento protected

ExercícioExercício emem salasala23

Page 24: Carlos Eduardo Batista Centro de Informática -UFPB bidu@ci ...wiki.cbatista.net/lib/exe/fetch.php/lpi-aula10... · Herança e composição: diferentes formas de se utilizar ‘blocos’

� Herança e composição em C++ (continuação)

Próxima aulaPróxima aula24

Page 25: Carlos Eduardo Batista Centro de Informática -UFPB bidu@ci ...wiki.cbatista.net/lib/exe/fetch.php/lpi-aula10... · Herança e composição: diferentes formas de se utilizar ‘blocos’

� Notas de aula do Prof. Renato Maia (Unimontes)

� Notas de aula do Prof. Renato Mesquita (UFMG)

ReferênciasReferências25

Page 26: Carlos Eduardo Batista Centro de Informática -UFPB bidu@ci ...wiki.cbatista.net/lib/exe/fetch.php/lpi-aula10... · Herança e composição: diferentes formas de se utilizar ‘blocos’

Linguagem de Linguagem de Programação IProgramação IProgramação IProgramação I

Carlos Eduardo Batista

Centro de Informática - [email protected]