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 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.
    • Por Pavolin
      Bom dia,
      estou com dificuldade em um problema que tenho que resolver:
       
      Escreva uma classe cujos objetos representam alunos matriculados em uma disciplina. Cada objeto dessa classe deve guardar os seguintes dados do aluno: matrícula, nome, 2 notas de prova e 1 nota de trabalho. Escreva os seguintes métodos para esta classe: calculaMedia - calcula a média final do aluno (cada prova tem peso 2,5 e o trabalho tem peso 2) calculaFinal calcula quanto o aluno precisa para a prova final (retorna zero se ele não for para a final). Deverá ser criada uma classe de teste para testar a chamada de todos os métodos.
    • Por Lucas Natan Cavichioli
      Boa noite galera, estou com uma dificuldade de lógica aqui.. rsrs. Estou consultando uma api de cnpj. Ele me traz um array que contém valores simples e alguns objetos
      exemplo:   
      "atividade_principal": [ { "text": "Atividades de televisão aberta", "code": "60.21-7-00" } ], "data_situacao": "03/11/2005", "nome": "GLOBO COMUNICACAO E PARTICIPACOES S/A", "uf": "RJ", "telefone": "(21) 2540-2623", "atividades_secundarias": [ { "text": "Reprodução de vídeo em qualquer suporte", "code": "18.30-0-02" }, { "text": "Portais, provedores de conteúdo e outros serviços de informação na internet", "code": "63.19-4-00" }, { "text": "Agenciamento de espaços para publicidade, exceto em veículos de comunicação", "code": "73.12-2-00" }, { "text": "Programadoras", "code": "60.22-5-01" } ] ....  
      .... $var = json_decode($json);            // Bloco de código: Seta todos os valores da api menos o cnpj         //define delimitador do foreach em 0.         $jafoi = 0;         $receitawsmodel = new Receitaws();                 foreach($var as $valor){                         if($jafoi == 0){                               foreach($var->atividade_principal as $valor){                                 $receitawsmodel->setRec_atv_prin_code($valor->code);                                 $receitawsmodel->setRec_atv_prin_text($valor->text);                             }                             foreach($var->atividades_secundarias as $valor){                                 var_dump($valor);                                 $array = array($valor->code, $valor->text);                                                                  var_dump($array);                                //aqui eu setava o array com todos os valores tipo: $receitawsmodel->setRec_atv_secundarias($str);                             }                                             $jafoi = 1;                         }                      } .... Tenho que armazenar essas informações no banco. No meu php está assim:
      O primeiro foreach, da certo, pois todo cnpj vai ter apenas uma atividade principal, porém, no segundo foreach a atividade secundária pode ter varios ou nenhuma. 
      Eu criei uma variavel "$jafoi" como um delimitador pra mim conseguir separar os objetos dos valores simples dentro do array. Como está ali eu crio 4 arrays(óbvio porque ele tem 4 atividades secundárias), gostaria de alguma ideia de como eu poderia fazer para que eu juntasse tudo isso em um array só e usasse um implode pra armazenar uma string com todos esses valores.
      Alguém pode me ajudar?
    • Por BrunoBit
      Fala rapaziada.
      Sabem como faço pra dizer pro autoload qual classe ele deve carregar e qual não deve? Eu sei que utilizando o use a gente consegue definir, porém estou com um problema, pq eu to usando o PHPMailer e o autoload ta querendo carregar automaticamente a classe Exception não sei pq.
      Veja como está o código:
      minha classe email onde instancio new PHPMailer():
      namespace classes; require_once("autoload/autoload.php"); use mailer\PHPMailer; // painel/mailer/PHPMailer.php class email { private $mail; public function __construct(){ $this->mail = new PHPMailer(); } } Só que agora vem o problema, dentro do arquivo PHPMailer.php existem 2 classes:
      class PHPMailer{ [code...] } class phpmailerException extends Exception { [code...] } O meu autoload, onde eu uso pra chamar o PHPMailer, ta querendo carregar também a classe Exception que phpmailerException está extendendo, não faço ideia do pq LOL
      Alguém sabe?
       
      Erro:
      PHP Fatal error: Class 'mailer\Exception' not found in  
      Desde já agradeço rapaziada, abração e fiquem com Deus.
×

Informação importante

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