Você está na página 1de 8

Sintaxe:

class [tag [: lista_de_bases ]]


{
lista_de_ membros
} [declaradores]; // similar à declaração de structs

[ class ] tag declarators; // similar à declaração de dados intrínsecos

Os elementos entre os simbolos [] são opcionais. Contudo o tag deve ser especificado se os
declaradores não o forem (primeira forma).

A palavra reservada class declara um tipo de classe (primeira forma) ou define um objeto de um tipo de
classe (segunda forma).
Os elementos de uma definição de classe são (sintaxe):

tag

Nome do tipo da classe. O tag passa a ser considerado uma palavra reservada no escopo de classes.

lista_de_bases

Especifica a classe (ou classes) a partir da qual (quais) esta é derivada (herança). Ou seja, especifica as suas
classes base. Cada nome de classe base pode ser precedido por um especificador de acesso (public, private,
protected) e da palavra reservada virtual. Consulte a Tabela de Privilégios de Acesso a Membros para
obter mais informações.

lista_de_ membros

Declara membros ou “friends” da classe. Membros podem ser dados, funções, outras classes aninhadas,
enums, campos de bits e nomes de tipos. “Friends” podem incluir funções ou classes. Não é permitia a
inicialização explícita de dados. Um tipo classe não pode conter a sí mesmo como um membro não estático.
Contudo, ele pode conter um ponteiro ou uma referência para sí mesmo. Consulte a palavra reservada
virtual e a Tabela de Privilégios de Acesso a Membros para mais informações.

declaradores

Declaram um ou mais objetos desse tipo de classe.

Exemplo

No exemplo a seguir, a classe CAboutDlg é derivada a partir da classe base CDialog. A nova classes
contem uma função membro, denominada CAboutDlg:
class CAboutDlg : public CDialog
{
public:
CAboutDlg();

protected:
virtual void DoDataExchange(CDataExchange* pDX);
};

Texto extraido dos manuais de C++ da Microsoft Corp e adaptado por Angelo Passaro. 1º semestre
Página 1/1
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{

public
public: [lista_de_membros]

public class_ base

Quando este especifidador de acesso public precede uma lista de membros da classe, significa que esses
membros podem ser acessados por qualquer função. Isto se aplica a todos os membros declarados após o
especificador até o próximo especificador de acesso, ou até o final da classe.

Quando a palavra reservada public precede o nome de uma classe base, significa que todos os membros
public ou protected da classe base são também public ou protected da classe derivada, respectivamente.

A forma de acesso padrão de membros de uma classe é private, enquanto que, o acesso padrão aos
membros de um structure ou union é public.

A forma de acesso padrão de uma classe base é private para classes e public para structures. Unions não
podem ter classes base.

Para mais informações, consulte private, protected, friend, e Tabela de Privilégios de Acesso a Membros.

Exemplo
class BaseClass
{
public:
int pubFunc();
};

class DerivedClass : public BaseClass


{
};
void main()
{
BaseClass aBase;
DerivedClass aDerived;
aBase.pubFunc(); // pubFunc() é acessível a partir de qualquer fuunção
aDerived.pubFunc(); // pubFunc() também é public na classe derivada
}

private
private: [lista_de_membros]

private class_base

Texto extraido dos manuais de C++ da Microsoft Corp e adaptado por Angelo Passaro. 1º semestre
Página 2/2
Quando o especifidador de acesso private precede uma lista de membros da classe, significa que esses
membros podem ser acessados somente por funções membro da classe ou friends da classe. Isto se aplica a
todos os membros declarados após o especificador até o próximo especificador de acesso, ou até o final da
classe.

Quando a palavra reservada private precede o nome de uma classe base, significa que todos os membros
public ou protected da classe base são membros private da classe derivada.

Para informações relacionadas a este tópico, consulte friend, public, protected, e Tabela de Privilégios de
Acesso a Membros.

Exemplo:
class BaseClass
{ public:
int pubFunc() { return privMem; }
private:
// privMem accessivel somente a partir de funções membro da classe
void privMem;
};

class DerivedClass : public BaseClass


{
public:
void usePrivate( int i )
{ privMem = i; } // Erro: privMem não é acessível a partir da classe derivada
};

class DerivedClass2 : private BaseClass


{
public:
// pubFunc() da BaseClass é acessível a partir da classe derivada
int usePublic() { return pubFunc(); }
};

void main()
{
BaseClass aBase;
DerivedClass aDerived;
DerivedClass2 aDerived2;
aBase.privMem = 1; // Erro: privMem não é acessível
aDerived.privMem = 1; // Erro: privMem não é acessível na classe derivada

aDerived2.pubFunc(); // Erro: pubFunc() é private na classe derivada


}

protected
protected: [lista_de_ membros]

protected class_base

Quando o especifidador de acesso protected precede uma lista de membros da classe, significa que esses
membros podem ser acessados somente por funções membro da classe ou friends da classe e por suas

Texto extraido dos manuais de C++ da Microsoft Corp e adaptado por Angelo Passaro. 1º semestre
Página 3/3
classes derivadas. Isto se aplica a todos os membros declarados após o especificador até o próximo
especificador de acesso, ou até o final da classe.

Quando a palavra reservada protected precede o nome de uma classe base, significa que todos os membros
public ou protected da classe base são membros protected da classe derivada.

Para informações sobre os tópicos relacionados, consulte public, private, friend, e Tabela de Privilégios de
Acesso a Membros.

Exemplo
class BaseClass
{
protected:
int protectFunc();
};

class DerivedClass : public BaseClass


{
public:
int useProtect()
{ protectFunc(); } // protectFunc é acessivel a partir da classe derivada
};

void main()
{
BaseClass aBase;
DerivedClass aDerived;
aBase.protectFunc(); // Erro: protectFunc não acessível
aDerived.protectFunc(); // Erro: protectFunc não acessível na classe derivada
}

A palavra reservada friend (amiga) permite o acesso de uma função, ou de uma classe aos membros
private e protected de uma outra classe.

Consulte, também,

Funções Friend
Uma função friend é uma função que não é membro de uma classe mas tem acesso aos seus dados
membros private e protected.

Uma função friend é declarada pela classe que está permitindo o acesso. A declaração friend pode ser
colocada em qualquer lugar na definição da classe. Ela não é afetada pela palavras reservadas de controle
de acesso.

Texto extraido dos manuais de C++ da Microsoft Corp e adaptado por Angelo Passaro. 1º semestre
Página 4/4
Exemplo 1

Uma função friend é definida como uma função não membro.


class Complex
{
public:
Complex( float re, float im );
friend Complex operator+( Complex first, Complex second ); // esta função tem acesso direto aos dados
// membros da classe Complex
private:
float real, imag;
};
Exemplo 2
Complex operator+( Complex first, Complex second )
{
return Complex( first.real + second.real,
first.imag + second.imag );
}
Neste exemplo, a função friend operator+ tem acesso aos dados membros privados dos objetos Complex
que ela recebe como parametros.

Note que a palavra reservada friend não aparece na definição da função.

Classes Friend
Uma classe friend é uma classe na qual todas as funções membro são funções friend de outra classe. Em
outras palavras, as funções membro têm acesso aos dados membros de outra classe, mesmo que estes sejam
private ou protected.

Exemplo
class SuaClasse
{
friend class SuaOutraClasse; // Declara uma classe friend
private:
int topSecret;
};

class SuaOutraClasse
{
public:
void change( SuaClasse yc );
};

void SuaOutraClasse::change( SuaClasse yc )


{
yc.topSecret++; // acesso direto ao dado membro privado
}
A relação de amizado não é mutua, a menos que seja especificada explicitamente. No exemplo acima,
funções membro da SuaClasse não podem acessar os dados membros privados de SuaOutraClasse.

Texto extraido dos manuais de C++ da Microsoft Corp e adaptado por Angelo Passaro. 1º semestre
Página 5/5
A relação de amizade não é herdada, ou seja, classes derivadas de SuaOutraClasse não podem acessar os
dados membros privados de SuaClasse. A relação também não é transitiva, ou seja, classes que são
friends de SuaOutraClasse não podem acessar os dados membros privados de SuaClasse.

Acesso na Classe Base Acesso na


Classe Base Herdada como: Classe Derivada
Public Public Public
Protected Protected
Private Sem acesso1
Public Protected Protected
Protected Protected
Private Sem acesso 1
Public Private Private
Protected Private
Private Sem acesso 1
1
A menos que declarações de acesso friend na classe base garante explicitamente o acesso..

virtual declarador_funcao_membro

virtual [especificador_acesso] nome_classe_base

A palavra reservada virtual declara uma função virtual ou uma classe base virtual.

Os elementos de uma declaração virtual são:

declarador_funcao_membro

Declara uma função membro.

especificador_acesso

Define o privilégio de acesso à classe base. Pode ocorrer antes ou após a palavra chave virtual.

nome_classe_base

Identifica um tipo de classe previamente declarada.

Para mais informações, consulte Função Virtual, Funções Virtuais Puras e Abstratas, e Classe Base Virtual.

Texto extraido dos manuais de C++ da Microsoft Corp e adaptado por Angelo Passaro. 1º semestre
Página 6/6
Função Virtual
Uma função virtual é uma função membro que, se espera, será redefinida em classes derivadas. Quando nos
referimos a um objeto de uma classe derivada usando um ponteiro ou uma referencia à classe base,
podemos acionar uma função virtual para aquele objeto e executar a versão da função que corresponde à
classe derivada.

Exemplo 1
class Empregado
{
public:
virtual float calculePagamento();
};

class Vendedor : public Empregado // classe derivada de Empregado


{
public:
float calculePagamento(); // função redefinida
};
Diferentes versões da função calculePagamento( ) podem ser executadas, dependendo do tipo de objeto a
partir do qual ela está sendo acionada.

Exemplo 2
Empregado umTrabalhador;
Vendedor umVendedor;
Empregado *p_empregado;

p_empregado = &umTrabalhador;
p_empregado->calculePagamento(); // executa Empregado::calculePagamento
p_empregado = &umVendedor;
p_empregado->calculePagamento(); // executal Vendedor::calculePagamento

A palavra reservada virtual é necessária somente na declaração da função da classe base; Todas as
declarações subsequentes em classes derivadas serão automaticamente virtuais.

A versão da função virtual correspondente à classe derivada deve apresentar a mesma lista de parâmetros e
tipo de retorno da função declarada na classe base. Se qualquer desses elementos for diferente, a função não
é considerada uma redefinição de função virtual.

Funções Virtuais Puras e Classes


Abstratas
Uma classe abstrata contem pelo menos uma função virtual pura. Uma função virtual pura é especificada
igualando-a a 0 no final de sua declaração. Não é necessário fornecer a definição de uma função virtual
pura.

Não se pode declarar uma instância (ou seja, um objeto) de uma classe abstrata pura. Ela pode ser utilizada
somente como uma classe base na definição de outras classes.

Texto extraido dos manuais de C++ da Microsoft Corp e adaptado por Angelo Passaro. 1º semestre
Página 7/7
Exemplo

Neste programa, desenha() é uma função virtual pura, definida na classe abstrata Forma. Objetos Forma
não podem ser declarados. Forma atua como uma classe base para Retangulo e Circulo. Retangulo e
Circulo fornecem definições para desenha(), e instâncias dessas classes podem ser utilizadas.
#include <iostream.h>

class Forma
{
public:
virtual void desenha() = 0; // declaração de uma função virtual pura.
// Portanto, a classe Forma é uma classe abstrata.
};

class Retangulo: public Forma // Classe Retangulo é derivada da classe Forma (Herança)
{
public:
void desenha();
};

class Circulo : public Forma // Classe Circulo é derivada da classe Forma (Herança)

{
public:
void desenha();
};

Classe Base Virtual


Classes Base virtuais oferecem um meio de economizar espaco e evitar ambiguidades em hierarquias de
classe que utilizam herança múltipla.

Cada objeto não virtual contem uma copia dos dados membros definidos na classe base. Esta duplicação
This duplication desperdiça espaço e requer que sejam especificadas quais cópias dos membros da classe
base são desejadas.

Quando uma classe base é especificada como uma base virtual, ela pode atuar como uma base indireta mais
do que uma vez sem duplicação de seus dados membros. Uma única cópia de seus dados membros é
compartilhada por todas as classes base que a utilizam como base virtual.

A palavra chave virtual é colocada na lista de bases das classes derivadas, e não a classe base.

Texto extraido dos manuais de C++ da Microsoft Corp e adaptado por Angelo Passaro. 1º semestre
Página 8/8

Você também pode gostar