pura. Esta funcao pode ou nao ser implementada na Base, mas a Derivada deve obrigatoriamente implementa-la.Uma funcao virtual pura e declarada da seguinte forma:virtual void Funcao() = 0;Veja o exemplo:class Base{public: //Funcao virtual pura nao implementada. virtual void FuncaoPuraUm() = 0; //Funcao virtual pura implementada: virtual void FuncaoPuraDois() = 0 { printf( "Funcao Pura Dois na base\n" ); }};class Derivada: public Base{public: //Somos obrigados a implementas as funcoes //virtuais puras da base aqui, senao da erro de //compilacao. void FuncaoPuraUm() { printf( "Funcao Pura Um implementada na derivada\n" ); } //Apesar de estar implementada na base, precisamos //implementa-la aqui tambem. void FuncaoPuraDois() { printf( "Funcao Pura Dois implementada na derivada\n" ); //opcionalmente podemos chamar a implementacao //da base aqui. Base::FuncaoPuraDois(); }};int main(){ Base* obj = new Derivada(); obj->FuncaoPuraUm(); obj->FuncaoPuraDois(); delete obj; return 0;}O resultado vai ser:Funcao Pura Um implementada na derivadaFuncao Pura Dois implementada na derivadaFuncao Pura Dois na baseTranquilo, ne? Se voce seguir corretamente a regra que eu comentei no comeco, vai tirar um grande beneficio com herancas, e dificilmente vai se meter em problemas. Vamos para os tipos menos conhecidos:Heranca privada:Um tipo de heranca menos conhecido e que deve ser evitado. Diferente da publica, na heranca privada, quando voce diz que B herda de A, esta dizendo que B tem A. Por exemplo, Carro poderia fazer uma heranca privada de Motor.A principal diferenca entre esta heranca e a publica, do ponto de vista tecnico, e que quem possui um objeto da classe Derivada nao ira conseguir chamar, por este objeto, uma funcao da classe Base. Voltemos ao primeiro exemplo:class Base{public: //Funcao virtual pura nao implementada. virtual void FuncaoPuraUm() = 0; //Funcao virtual pura implementada: virtual void FuncaoPuraDois() = 0 { printf("Funcao Pura Dois na base\n"); }};class Derivada: private Base{public: //Somos obrigados a implementas as funcoes //virtuais puras da base aqui, senao da erro de //compilacao. void FuncaoPuraUm() { printf( "Funcao Pura Um implementada na derivada\n" ); } //Apesar de estar implementada na base, precisamos //implementa-la aqui tambem. void FuncaoPuraDois() { printf( "Funcao Pura Dois implementada na derivada\n" ); //opcionalmente podemos chamar a implementacao //da base aqui. Base::FuncaoPuraDois(); }};int main(){ //Base* obj = new Derivada(); Derivada* obj = new Derivada(); //obj->FuncaoPuraUm(); obj->FuncaoPuraDois(); delete obj; return 0;}Note as diferencas:A heranca agora e private, e nao mais public;Fazer um ponteiro do tipo Base apontar para um objeto alocado como o tipo Derivada ja nao funciona mais. (E possivel utilizar um reinterpret_cast aqui para passar esta seguranca, porem voce ja esta hackeando o codigo e vai acabar com um comportamento inesperado mais cedo ou mais tarde);Nao e mais possivel chamar as funcoes que estao na Base atraves do objeto da Derivada. Assim, a linha obj->FuncaoPuraUm(); teve que ser comentada.O mesmo vale caso voce herde (independente da forma da heranca) uma classe de Derivada (uma classe chamada DerivadaDaDerivada, vamos supor). DerivadaDaDerivada nao conseguira acessar nenhum metodo ou atributo de Base diretamente, independente se este metodo ou atributo e publico, protegido ou privado.Mas por que usar heranca privada, e nao composicao ou agregacao?Dificil responder, ate porque voce deve utilizar composicao ou agregacao em vez de heranca