Ir para conteúdo

Recommended Posts

Galera, estou precisando criar uma variável do tipo object que poderá instanciar outros tipos que à herdam.

#include <iostream>
#include <cstdlib>

class Animal {

	public:
	
	    char *nome;
	
	    Animal (char *nome) {
	        this->nome = nome;
	    }

};

class Cachorro : public Animal {
	
	public:
	
	    bool enterraOsso;
	
	    Cachorro (char* nome, bool enterraOsso) : Animal(nome) {
	        this->enterraOsso = enterraOsso;
	    }

};

class Passaro : public Animal {

	public:
	
	    bool voar;
	
	    Passaro (char* nome, bool voar) : Animal(nome) {
	        this->voar = voar;
	    }

};

int main() {

	Animal *animal;
   
	animal = new Cachorro("Scooby", true);
	std::cout << animal->nome << ", " << animal->enterraOsso << std::endl;
   
   	animal = new Passaro("Piopio", false);
	std::cout << animal->nome << ", " << animal->voar << std::endl;
	
	return 0;
}

A ideia é que a partir da variável da class super eu poderia acessar os atributos da subclass também.

Não sei se isto é cast ou polimorfismo. No java sei que é possível, mas não estou conseguindo fazer em c++.

 

Grato desde já pela ajuda de todos....

Compartilhar este post


Link para o post
Compartilhar em outros sites

Em C++, o tipo da variável declarada é encarada como se tivesse um objeto daquele tipo nela, é por isso que seu código retorna isso:

error: ‘class Animal’ has no member named ‘enterraOsso’
  std::cout << animal->nome << ", " << animal->enterraOsso << std::endl;

O compilador vai analisar a variável do tipo Animal e não vai encontrar tais membros lá. Se não me engano, já li em algum lugar que você pode fazer isso que você está tentando fazer, dessa maneira. Mas não tenho certeza... No entanto, uma maneira que conheço de resolver esse problema é fazendo um downcast através do dynamic_cast. Para usar dynamic_cast, a classe base deve ser considerada polimórfica, o que é conseguido através da declaração de pelo menos um método virtual. Geralmente quando não há um em questão, usa-se o destrutor. Assim, mude sua classe Animal para:

 

class Animal 
{
    public:
        char* nome;
  
        Animal (char* nome)
        {
            this->nome = nome;
        }
  
        virtual ~Animal( ) { };
};

 

Então faça os dynamic casts:

 

Cachorro* cachorro = dynamic_cast<Cachorro*>( animal );
Passaro* passaro = dynamic_cast<Passaro*>( animal );

Depois troque a variável animal pela equivalente adquirida pelo dynamic cast.

 

Se alguém souber se é possível usar uma variável de classe base com objeto de classe derivada, diga aí.

 

Uma vez que está usando ponteiros, não esqueça de deletá-los, embora eu recomende o uso de smart pointers... Se bem que acredito que seu código é apenas para aprendizado...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, pelo que isso diz, nem em Java você consegue acessar membros de uma classe derivada por meio de uma classe base. No entanto, por meio de um casting você pode fazer. É algo que ultrapassa os princípios de design de classes. Aqui você pode perceber o mesmo caso em C++. A solução é a mesma, embora ele não use uma variável em seu exemplo e sim um valor temporário. Resumidamente, você sempre vai poder criar instâncias de objetos derivados em variáveis de classe base. Só não é garantido o acesso dos membros da classe derivada, a menos que use casting.

  • +1 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por gustavo.abarroso
      Estou tentando criar uma lista genérica de clientes, onde posso adicionar pessoasFisicas e pessoasJuridicas.
       
      Dentro da classe clientes possuo os atributos nome, lista de endereços e limite de crédito.
      A classe pessoaFisica herda de cliente os atributos acima citados além de possuir o atributo cpf.
      A classe pessoaJuridica herda de cliente seus atributos e possui também, nomeFantasia e cnpj.
       
      O problema que está acontecendo é o seguinte: na hora que cadastro mais de uma pessoa física por exemplo e puxar o relatório, me vem a lista de endereços inteira (conforme foto em anexo) ao invés de vim a lista da pessoa de cada posição do ArrayList de clientes. Como resolvo isso?
       
      public void cadastrar() { int op, resp; System.out.println("\n==[Cadastro de clientes]=="); System.out.println("Digite 1 para cadastrar pessoa fisica."); System.out.println("Digite 2 para cadastrar pessoa juridica."); System.out.print("=> "); op = input.nextInt(); switch (op) { case 1: System.out.println("\n==[Pessoa fisica]=="); System.out.print("Informe o nome: "); nome = inputs.nextLine(); do { listaEndFisica.add(retornaUmEndereco()); System.out.println("Continuar cadastrando endereços? 1-Sim/0-Não"); resp = input.nextInt(); } while (resp != 0); System.out.print("Informe o limite de crédito: "); limiteCredito = input.nextDouble(); System.out.print("informe o cpf: "); cpf = inputs.nextLine(); PessoaFisica pessoaFisica = new PessoaFisica(nome, listaEndFisica, limiteCredito, cpf); listaCliente.add(pessoaFisica); System.out.println("\nPessoa fisica adicionado com sucesso! "); break; case 2: System.out.println("\n==[Pessoa Juridica]=="); System.out.print("Informe o nome: "); nome = inputs.nextLine(); do { listaEndJuridica.add(retornaUmEndereco()); System.out.println("Continuar cadastrando endereços? 1-Sim/0-Não"); resp = input.nextInt(); } while (resp != 0); System.out.print("Informe o limite de crédito: "); limiteCredito = input.nextDouble(); System.out.print("Informe o nome fantasia: "); nomeFantasia = inputs.nextLine(); System.out.print("Informe o cnpj: "); cnpj = inputs.nextLine(); PessoaJuridica pessoaJuridica = new PessoaJuridica(nome, listaEndJuridica, limiteCredito, nomeFantasia, cnpj); listaCliente.add(pessoaJuridica); System.out.println("\nPessoa juridica adicionado com sucesso! "); break; default: System.out.println("opção inválida! "); } } public void relatorio() { if (listaCliente.isEmpty()) { System.out.println("Não existem clientes cadastrados! "); } else { for (Cliente c : listaCliente) { if (c instanceof PessoaFisica) { System.out.println("\n-=[Pessoas Fisicas]=-"); System.out.println("Nome: " + c.getNome()); System.out.println("-=[Endereço(s) Associado(s)]<-"); for (Endereco end : listaEndFisica) { System.out.println("Logradouro: " + end.getLogradouro()); } System.out.println("Limite de crédito: " + c.getLimiteDeCredito()); System.out.println("Cpf: " + ((PessoaFisica) c).getCpf()); } else if (c instanceof PessoaJuridica) { System.out.println("\n-=[Pessoas Juridicas]=-"); System.out.println("Nome: " + c.getNome()); System.out.println("-=[Endereço(s) Associado(s)]<-"); for (Endereco end : listaEndJuridica) { end.getLogradouro(); System.out.println("Logradouro: " + end.getLogradouro()); } System.out.println("Limite de crédito: " + c.getLimiteDeCredito()); System.out.println("Nome fantasia: " + ((PessoaJuridica) c).getNomeFantasia()); System.out.println("Cnpj: " + ((PessoaJuridica) c).getCnpj()); } } } }  

    • Por xDenisX
      Olá pessoal, estou com uma dúvida, já pesquisei mas não encontrei nenhuma solução.
       
      Quero trocar a classe de uma div em css3 por meio de JavaScript. Por exemplo eu clico em um botão e o mesmo chama uma função em JavaScript que vai mudar a classe design1 para a classe design2 desta div.
       
      Abaixo esta o código feito. alguém poderia me ajudar ? Obrigado.
       
      <html> <head> <title></title> </head> <style type="text/css"> .design1{ background-color: blue; width: 200px; height: 200px; margin-bottom: 30px; } .design2{ background-color: yellow; width: 250px; height: 250px; margin-bottom: 30px; } </style> <script type="text/javascript"> function mudarClasse(){ document.getElementById("quadrado").style./****Não sei oque colocar aqui para mudar a classe*****/; } </script> <body> <div class="design1" id="quadrado"></div> <input type="button" name="botao" value="Mudar de classe" onclick="mudarClasse()"> </body> </html>  
    • Por Fábio.info7
      Sou iniciante em php OO, em caráter de estudo criei uma primeira aplicação com OO em php, foi um sistema de CRUD,  acontece que eu fiz a listagem dos dados através de uma função que vou postar abaixo, nela eu exibo os dados do banco em uma tabela html, minha dúvida é, posso usar essa tabela HTML, bem como todas as formatações em boostrap diretamente dentro da função como fiz abaixo? Está tudo funcionando, porém como nunca ví ninguém usar desta maneira fiquei com essa dúvida, é correto o uso desta forma ou não é uma boa prática? Entendo que exista outras formas, mas como eu disse estou iniciando e tentando entender oq é correto ou não.
       
      segue a função citada:
          
          //////// LISTANDO OS DADOS ///////////////////////
          public function listaDados(){                  require_once './conexao.php';         $sql = "SELECT * FROM DADOS";         $stmt = $conn->prepare($sql);                  if($stmt->execute()== true){         ?>             <table>                 <tr>                     <th>NOME</th>                     <th>TELEFONE</th>                     <th>PACOTE</th>                      <th>VENCIMENTO</th>                     <th></th>                  </tr>         <?php                 $conta_registros = $stmt->rowCount();                 for($I = 0; $I < $conta_registros; $I++){                     $linha = $stmt->fetch(PDO::FETCH_ASSOC);                 ?>                 <tr>                     <td><?php echo $linha['nome'];?></td>                     <td><?php echo $linha['telefone'];?></td>                     <td><?php echo $linha['pacote'];?></td>                     <td><?php echo $linha['vencimento'];?></td>                     <td>                                            <!-- BOTÃO EDITAR -->                         <a href="form-update.php?id=<?php echo $linha['iddados'];?>">                             <button type="button">                                 <span></span> Editar                             </button>                         </a>                         <!-- BOTÃO EXCLUIR -->                         <a href="delete.php?id=<?php echo $linha['iddados'];?>">                              <button type="button">                                  Excluir                             </button>                         </a>                     </td>                 </tr>                  </table>         <?php                     }         }     
    • Por Pavolin
      Bom dia,
      estou com dificuldade em um problema que tenho que resolver:
       
      Crie uma classe Televisao e uma classe ControleRemoto que pode controlar o volume e trocar os canais da televisão. O controle de volume permite:
      ·         aumentar ou diminuir a potência do volume de som em uma unidade de cada vez;
      ·         aumentar e diminuir o número do canal em uma unidade
      ·         trocar para um canal indicado;
      ·         consultar o valor do volume de som e o canal selecionado.
    • Por Pavolin
      Bom dia,
      estou com dificuldade em um problema que tenho que resolver:
       
      Crie uma classe denominada Elevador para armazenar as informações de um elevador dentro de um prédio. A classe deve armazenar o andar atual (térreo = 0), total de andares no prédio (desconsiderando o térreo), capacidade do elevador e quantas pessoas estão presentes nele. A classe deve também disponibilizar os seguintes métodos:
      construtor : que deve receber como parâmetros a capacidade do elevador e o total de andares no prédio (os elevadores sempre começam no térreo e vazio);
      Entra : para acrescentar uma pessoa no elevador (só deve acrescentar se ainda houver espaço);
      Sai : para remover uma pessoa do elevador (só deve remover se houver alguém dentro dele);
      Sobe : para subir um andar (não deve subir se já estiver no último andar);
      Desce : para descer um andar (não deve descer se já estiver no térreo);
      Encapsular todos os atributos da classe (criar os métodos set e get).
      Deverá ser criada uma classe de teste para testar a chamada de todos os métodos.
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.