FAQ Lite
Herança - Conceitos Básicos

[ 19.1 ] Herança é importante para C++?
[ 19.2 ] Quando e como eu devo usar herança?
[ 19.3 ] Como eu represento herança em C++?
[ 19.4 ] Pode-se converter o pointer de uma classe derivada para o de sua classe base?
[ 19.5 ] Qual é a diferença entre public:, private: e protected:?
[ 19.6 ] Porque minha classe derivada não pode acessar membros private: de minha classe base?
[ 19.7 ] Como eu protejo minhas subclasses contra erros decorrentes de alterações nas partes internas de minha classe?

[ 19.1 ] Herança é importante para C++?

Sim.

Herança é o que distingue programação com dados abstratos - abstract data type (ADT) - de programação orientada a objeto.

Topo
[ 19.2 ] Quando e como eu devo usar herança?

Como um recurso de especificação.

Os seres humanos fazem abstrações das coisas em duas dimensões: parte-de e do-tipo. Um Ford Taurus é um tipo de carro, e um Ford Taurus tem-um motor, pneus, etc. A hierarquia parte-de tornou-se importante em desenvolvimento de software quando a abordagem abstração de dados (ADT) mostrou-se relevante. Herança acrescenta mais uma importante dimensão de decomposição, de fato acrescenta uma terceira dimensão..

Topo
[ 19.3 ] Como eu represento herança em C++?

Usando a sintaxe : public
    class Car : public Vehicle {
    public:
      // ...
    }; 
Podemos expressar a relação acima de várias maneiras:
  • Car é um tipo de Vehicle
  • Car é derivado de Vehicle
  • Car é derivado de Vehicle
  • Car é uma especialização de Vehicle
  • Car é uma subclasse de Vehicle
  • Vehicle é a classe base de Car
  • Vehicle é a superclasse de Car (Essa expressão não é comum na comunidade C++)

Nota: Este FAQ trata de herança de membros public. Herança de membros private ou protected tem outras especificidades)

Topo
[ 19.4 ] Pode-se converter o pointer de uma classe derivada para o de sua classe base?

Sim.

Um objeto de uma classe derivada é um tipo de objeto da classe base. Portanto a conversão de um pointer que aponta uma classe derivada para um que aponte a classe base é perfeitamente segura, e acontece freqüentemente. Por exemplo, se eu estou apontando para um car, eu estou de fato apontando para um vehicle, de modo que converter um Car* para Vehicle* é perfeitamente seguro e normal:

    void f(Vehicle* v);
    void g(Car* c) { f(c); }  // Perfectly safe; no cast 
Nota: Este FAQ trata de herança de membros public. Herança de membros private ou protected tem outras especificidades)
Topo
[ 19.5 ] Qual é a diferença entre public:, private: e protected:?

  • Um membro - seja um dado membro ou uma função membro - declarado em uma seção private: de uma classe somente poderá ser acessado por funções membro ou por funções friend da classe.
  • Um membro - seja um dado membro ou uma função membro - declarado em uma seção protected: da classe poderá ser acessado por funções membro ou por funções friend da classe, e ainda por funções membro ou por funções friend de classes derivadas.
  • Um membro - seja um dado membro ou uma função membro - declarado em uma seção public: da classe poderá ser acessado a partir de qualquer outro código.
Topo
 
[ 19.6 ] Porque minha classe derivada não pode acessar membros private: de minha classe base?

Para protegê-lo de futuras modificações na classe base.

Classes derivadas não têm acesso a membros privados da classe base. Isso efetivamente isola a classe derivada de qualquer alteração que venha a ser feita nos membros private: da classe base.

Topo
[ 19.7 ] Como eu protejo minhas subclasses contra erros decorrentes de alterações nas partes internas de minha classe?

Uma classe tem duas interfaces distintas, para dois tipos de clientes distintos:
  • Uma interface public: que destina-se a classes não relacionadas à classe base
  • Uma interface protected: que destina-se às classes derivadas da classe base

A menos que você possa garantir que todas as suas subclasses serão implementadas pela mesma equipe de programação, você deve ter o cuidado de fazer com que as partes internas de sua classe sejam private:, e usar funções de acesso protected: inline para que as classes derivadas possam acessar o dados internos da classe base. Dessa forma, as partes internas da classe base podem se alterar sem impacto nas classes derivadas, a menos, é claro, que você altere as funções protected: de acesso .

Topo
C++ FAQ Lite
Copyright © 1991-98 by Marshall Cline Ph.D., cline@parashift.com
Tradução: Dagoberto Haele Arnaut

| Home | Bookmarks | Universidades | Para Saber mais | Universidades | WEB Directory | Mapa do site |