Baixe o app para aproveitar ainda mais
Prévia do material em texto
Texto extraido dos manuais de C++ da Microsoft Corp e adaptado por Angelo Passaro. 1º semestre Página 1/1 ������������������������ 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 2/2 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 3/3 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 4/4 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 5/5 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 6/6 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 Classe Base Herdada como: Acesso na Classe Derivada Public Protected Private Public Public Protected Sem acesso1 Public Protected Private Protected Protected Protected Sem acesso 1 Public Protected Private Private 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 7/7 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 8/8 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.
Compartilhar