Programação Orientada a Objetos em C++: introdução à herança Disciplina de Programação Científica II Aula 15 de 18 21/06/2013 Professor Giovani Gracioli giovanig@gmail.com
Objetivos Os objetivos dessa aula são: Apresentar herança em C++ Como criar uma classe que herda outra Noções de classes-base e classes derivadas e as relações entre elas Exercício 4 da lista 3
Competências Necessárias Para esta aula, vocês precisarão: Entender a linguagem de programação C, noções de programação e programação C++ Conteúdo relacionado às aulas anteriores e computação científica I Aulas 12 e 14 (C++)
Competências a Desenvolver Com essa aula, você aprenderá: A definir o que é herança em programação orientada a objetos A definir classe-base e classe derivada A declarar classes derivadas de classes-base em C++
Conteúdo
Introdução (1) Herança é uma forma de reutilização de software em que você cria uma classe que absorve dados e comportamentos de uma classe existente e os melhora com novas capacidades Você poderá designar que a nova classe deverá herdar os membros de uma classe já existente Essa classe existente é chamada de classebase, e a nova classe é conhecida como classe derivada
Introdução (2) Uma classe derivada representa um grupo de objetos mais especializados Uma classe derivada contém comportamentos herdados de sua classe-base e também comportamentos adicionais Uma classe derivada também pode personalizar comportamentos herdados da classe-base
Introdução (2) Herança Simples Uma classe é derivada de uma classe-base Herança Múltipla Uma classe derivada herda de várias classes-base (possivelmente não relacionadas) Estudaremos herança simples
Classes-base e classes derivadas Frequentemente, um objeto de uma classe também é um objeto de outra classe Por exemplo, na geometria, um retângulo é um quadrilátero (assim como os quadrados, paralelogramos e trapezoides) Assim, em C++, pode-se dizer que a classe Retangulo herda da classe Quadrilatero Nesse contexto, a classe Quadrilatero é uma classe-base, e a classe Retangulo é uma classe derivada Um retângulo é um tipo específico de quadrilátero, mas é incorreto afirmar que um quadrilátero é um retângulo o quadrilátero poderia ser um paralelogramo ou alguma outra forma
Exemplos de classes-base e derivadas
Acesso aos membros da classebase As funções-membro da classe derivada podem exigir o acesso a dados-membro e funçõesmembro da classe-base Uma classe derivada pode acessar os membros não private de sua classe-base Os membros de classe-base que não devem ser acessíveis às funções-membro de classes derivadas devem ser declaradas como private na classe-base
Exemplo: uma comunidade universitária
Declarando uma classe derivada Para declarar uma classe derivada de outra já existente, procedemos da seguinte forma class classe_derivada : public classe_base { //corpo da classe derivada }; Note o uso do operador : entre o nome da classe derivada e o nome da classe base. Este operador promove a herança entre as duas classes Antes do nome da classe base, devemos declarar o grau de visibilidade da classe base (public no exemplo)
Grau de Visibilidade public: Métodos ou atributos podem ser acessados por qualquer um, a partir do objeto da classe protected: Métodos ou atributos podem ser acessados somente por atributos da própria classe ou pela classe derivada private: Métodos ou atributos podem ser acessados somente por atributos da própria classe
Exemplo: veículos rodoviários (1) #include <iostream> using namespace std; class VeiculoRodoviario // Define uma classe base veículos. { private: int rodas; int passageiros; public: VeiculoRodoviario() { } VeiculoRodoviario(int r, int p) { rodas = r; passageiros = p; } void setrodas(int num) { rodas = num; } int getrodas() { return rodas; } void setpassageiros(int num) { passageiros = num; } int getpassageiros() { return passageiros; } }; class Caminhao : public VeiculoRodoviario // Define um caminhao. { int carga; public: Caminhao() { } Caminhao(int c, int r, int p) : VeiculoRodoviario(r, p) { carga = c; } void setcarga(int size) { carga = size; } int getcarga() { return carga; } void mostrar() { cout << rodas: << getrodas() << \n ; cout << passageiros: << getpassageiros() << \n ; cout << carga (capacidade em litros): << getcarga() << \n ; } };
Exemplo: veículos rodoviários (2) enum tipo {car, van, vagao}; class Automovel : public VeiculoRodoviario // Define um automovel. { enum tipo tipocarro; public: Automovel() { } Automovel(tipo t, int r, int p) : VeiculoRodoviario(r, p) { tipocarro = t; } void settipo(tipo t) { tipocarro = t; } enum tipo gettipo() { return tipocarro; } void mostrar() { cout << "rodas: " << getrodas() << "\n"; cout << "passageiros: " << getpassageiros() << "\n"; cout << "tipo: "; switch(gettipo()) { case van: cout << "van\n"; break; case car: cout << "carro\n"; break; case vagao: cout << "vagao\n"; }; } }
Exemplo: veículos rodoviários (3) int main() { Caminhao t1, t2(6, 4, 2000); Automovel c; t1.setrodas(18); t1.setpassageiros(2); t1.setcarga(3200); t1.mostrar(); cout << "\n"; t2.mostrar(); cout << "\n"; c.setrodas(4); c.setpassageiros(6); c.settipo(van); c.mostrar(); return 0; }
Finalizando
Revisão Uma classe derivada herda membros (métodos e atributos) da classe base Exemplo: class classe_derivada : public classe_base { //corpo da classe derivada }; Uma classe derivada pode acessar os membros não private de sua classe-base Todo acesso a membros privados deve ser feito por métodos públicos
Sugestões Finais Resolvam a lista de exercícios da aula (disponível no ambiente EAD) Só se aprende a programar, programando Dúvidas sobre os exercícios podem ser enviadas por email
Referências Bibliográficas Paul Deitel e Harvey Deitel, C: como programar, 6a edição, Ed. Prentice Hall Brasil, 2011. Paul Deitel e Harvey Deitel, C++: como programar, 5a edição, Ed. Prentice Hall Brasil, 2006. Antonio Filho, Introdução à Programação Orientada a Objetos com C++, 1a edição, Ed. Campus, 2010.