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 lucas01andre
      Olá pessoa, estou aprendendo JavaScript e quero aprender também boas práticas. Ao olhar de vocês, ao declarar uma função em um objeto é melhor usar a forma tradicional ou a arrow? Por que usar e quando usar uma das duas? Desde já agradeço a ajuda!
    • Por asacap1000
      Galera preciso de uma ajuda, não sei mais nem como procurar a cabeça está dando nó kkkk.
      Tenho projeto que estará controlando o tempo de acesso no estabelecimento impondo um limite de 100 minutos.
      Dentro do mesmo dia estou conseguindo realizar os calculos normais, porém se o usuário entrar 23:00 ele terá que sair no máximo às 00:40.
      O horário eu consegui montar conforme o select abaixo a data mantém a mesma da entrada.
      select aces.seqreg SEQUENCIA, aces.diracc SENTIDO, aces.horacc MINUTOS, --acesso em minutos (aces.horacc + 100) LIMITE, --limite de acesso foi adicionado mais 100 minutos CONVERT(varchar(2), Day(aces.datacc)) + '/' + CONVERT(varchar(2), MONTH(aces.datacc)) + '/' + CONVERT(varchar(4), Year(aces.datacc)) + ' ' + right( '00' + cast(aces.horacc / 60 as varchar), 2) + ':' + right( '00' + cast(aces.horacc - ((aces.horacc / 60) * 60) as varchar), 2 ) AS HORA,--data e hora de entrada CONVERT(varchar(2), Day(aces.datacc)) + '/' + CONVERT(varchar(2), MONTH(aces.datacc)) + '/' + CONVERT(varchar(4), Year(aces.datacc)) + ' ' + right( '00' + cast( ((aces.horacc + 100)%1440)/60 as varchar), 2) + ':' + right( '00' + cast(((aces.horacc + 100)%1440)%60 as varchar), 2 ) 'SAIDA', --data e hora que deve sair Convert(Char(5),GetDate(),114) ATUAL from kansas.kansas.r070ara aces LEFT JOIN kansas.kansas.r090mvi mv on aces.numcra = mv.numcra and aces.numdoc = mv.numdoc where CONVERT(DATETIME, CONVERT(NVARCHAR(10), aces.datacc, 103), 103) >= CONVERT(DATETIME, '29/09/2018', 103) and CONVERT(DATETIME, CONVERT(VARCHAR(10), aces.datacc, 103), 103) <= CONVERT(DATETIME, '29/09/2018', 103) and (aces.coddsp like '1') and aces.numdoc = '325605397' order by aces.seqreg, aces.nompes, aces.coddsp O problema está nesta parte do select:
       
      CONVERT(varchar(2), Day(aces.datacc)) + '/' + CONVERT(varchar(2), MONTH(aces.datacc)) + '/' + CONVERT(varchar(4), Year(aces.datacc)) + ' ' + right( '00' + cast( ((aces.horacc + 100)%1440)/60 as varchar), 2) + ':' + right( '00' + cast(((aces.horacc + 100)%1440)%60 as varchar), 2 ) 'SAIDA', --data e hora que deve sair A parte de data ele não traz a data seguinte na imagem abaixo a saída deveria ser 30/09/2018 01:27
       

       
      Alguém poderia me dar uma força tenho que entregar essa semana este projeto no trabalho e está muito punk a bagaça...
       
    • 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>  
×

Informação importante

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