No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Herencia m煤ltiple

14/16
Recursos

Aportes 9

Preguntas 4

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

Una situaci贸n que puede y es muy probable que suceda, es el conocido como 鈥淧roblema del diamante鈥 debido a la ambig眉edad que se introduce ya que el compilador no puede establecer de donde hereda la clase. Recomendaci贸n: Hereden de UNA y SOLO UNA clase a la vez.
https://es.wikipedia.org/wiki/Problema_del_diamante

Codigo:

#include <iostream>
#include <string>

using namespace std;

class Animal {
protected:
    static int numero_animales;
    string alimento;
public:
    Animal();
    ~Animal();
    static int obtenerNumeroAnimales();
    string obtenerAlimento(){
        return alimento;
    };
    void comer(){
        cout<<"Este animal est谩 comiendo " <<alimento<<"... 帽om 帽om"<<endl;
    };
};

int Animal::numero_animales = 0;

Animal::Animal()
{
    cout<<"Creando nuevo animal ... "<<endl;
    numero_animales += 1;
}

Animal::~Animal()
{
    cout<<"Borrando animal..."<<endl;
    numero_animales-=1;
}

int Animal::obtenerNumeroAnimales()
{
    return numero_animales;
}

class Herviboro : public Animal {
public:
    Herviboro():Animal(){
        this->alimento = "plantas ";
    }
    void pastar(){
        cout<<"Este animal est谩 pasteando ..."<<endl;
    }
};

class Carnivoro : public Animal {
public:
    Carnivoro():Animal(){
        this->alimento = "plantas ";
    }
    void cazar(){
        cout<<"Este animal est谩 cazando ..."<<endl;
    }
};

class Omnivoro : public Herviboro, public Carnivoro{
public: 
    Omnivoro():Herviboro(),Carnivoro(){}
    void comer(){
        cout<<"Este animal come lo que sea ...."<<endl;
    }
};

int main(){
    Animal *a = new Animal();
    Herviboro *h = new Herviboro();
    Carnivoro *c = new Carnivoro();
    Omnivoro *o = new Omnivoro();

    cout<<"Numero de animeles: "<<Animal::obtenerNumeroAnimales()<<endl;
    
    a->comer();
    
    h->pastar();
    h->comer();

    c->cazar();
    c->comer();
    cout<<"omnivoro"<<endl;
    o->comer();

    delete a;
    cout<<"Numero de animales"<<Animal::obtenerNumeroAnimales()<<endl;
}

Hola, quer铆a comentar que en la clase Omnivoro algo no quedo bien. Si nos fijamos cuenta 5 animales, cuando deber铆an ser 4.
Entiendo que algo del constructor no quedo bien, ya que esta pasando 2 veces por el constructor Animal.
No se si estoy en lo correcto.

class Omnivoro : public Herviboro, public Carnivoro {
    public:
        Omnivoro() : Herviboro(), Carnivoro() {}
        void comer() {
            cout << "Este animal como lo que sea..." << endl;
        }
};

int main() {
    Animal *a = new Animal();
    Herviboro *h = new Herviboro();
    Carnivoro *c = new Carnivoro();
    Omnivoro *o = new Omnivoro();

    cout << "Numero de animales " << Animal::obtenerNumeroAnimales() << endl;
    
    a->comer();
    
    h->pastar();
    
    h->comer();
    
    c->cazar();
    
    c->comer();

    cout << "Omnivoro" << endl;
    o->comer();
    
    delete a;
    cout << "Numero de animales " << Animal::obtenerNumeroAnimales() << endl;    
}
#include <iostream>
#include <conio.h>
#include <stdlib.h>
#include <string>
#include <locale.h>

using namespace std;
class Mounstro {
protected:
	static int numeroMounstros;
	string alimento;
public:
	Mounstro();
	~Mounstro();
	static int obtenerNumeroMounstros();
	string obtenerAlimento() {
		return alimento;
	}
	void comer() {
		cout << "Este mounstro est谩 comiendo " << alimento << " rico, rico " << endl;
	}
	
};

int Mounstro::numeroMounstros = 0;
Mounstro::Mounstro()
{
	cout << "Creando nuevo mounstro...." << endl;
	numeroMounstros += 1;
}
int Mounstro::obtenerNumeroMounstros()
{
	return numeroMounstros;
}
Mounstro::~Mounstro()
{
	cout << "borrando bicho...." << endl;
	numeroMounstros -= 1;
}
class Herviboro : public Mounstro{
public:
	Herviboro() : Mounstro() {
		this->alimento = "plantas";
}
	void pastar() {
		cout << "Este animal est谩 pastando... " << endl;
	}
};

class Carnivoro : public Mounstro {
public :
	Carnivoro() : Mounstro() {
		this->alimento = "carne";
	}
	void cazar() {
		cout << "Este animal est谩 cazando..." << endl;
	}
};

class Omnivoro : public Herviboro, public Carnivoro {
public:
	Omnivoro() : Herviboro(), Carnivoro(){}
	void comer() {
		cout << "este animal come cualquier cosa " << endl;
	}
};


	int main() {
		setlocale(LC_ALL, "");

		Mounstro* m = new Mounstro();
		Herviboro* h = new Herviboro();
		Carnivoro* c = new Carnivoro();
		Omnivoro* o = new Omnivoro();
		cout << "Numero de mounstros: " << Mounstro::obtenerNumeroMounstros() << endl;
		m->comer();
		h->pastar();
		h->comer();
		c->cazar();
		c->comer();
		cout << "omnivoro" << endl;
		o->comer();
		delete m;
		cout << "Numero de mounstros: " << Mounstro::obtenerNumeroMounstros() << endl;
	getch();
};

Algo que aclarar que cuando se crea un Omn铆voro, como llama a funci贸n de crear tanto de Herb铆voro como de Carn铆voro, el contador de animales suma 2 en vez de uno.

Crear una clase en C++ que extiende de 2 clases utilizando la herencia m煤ltiple.

Mi codigo:

#include <iostream>
#include <string>
using namespace std;
//Crear objeto
class Animal{
  //private:
  protected:
  static int numero_animales;
  string alimento;
  public:
  Animal();
  ~Animal();
  static int obtenerNumeroAnimales();
  string obtenerAlimento(){
    return alimento;
  }
  void comer(){
    cout<<"Este animal esta comiendo "<<alimento<<". . . yomi yomi"<<endl;
  }
};
//Inicializar variable
int Animal::numero_animales = 0;
//Constructor y Destructor
Animal::Animal(){
  cout<<"Creando nuevo animal..."<<endl;
  numero_animales +=1;
}
Animal::~Animal(){
  cout<<"Borrando animal ..."<<endl;
  numero_animales -=1;
}
int Animal::obtenerNumeroAnimales(){
  return numero_animales;
}

//Clase que Hereda
class Herviboro : public Animal{
  public:
    Herviboro() : Animal(){
      this->alimento = "plantas";
    }
    void pastar(){
      cout<<"Este animal esta pastando ..."<<endl;
    }
};

class Carnivoro : public Animal{
  public:
  Carnivoro() : Animal(){
    this->alimento= "carne";
  }
  void cazar(){
    cout<<"Este animal esta cazando ..."<<endl;
  }
};

class Omnivoro : public Herviboro, public Carnivoro{
  public:
  Omnivoro() : Herviboro(),Carnivoro(){}
  void comer(){
    cout<<"Este animal come lo que sea..."<<endl;
  }
};

int main(){
  Animal *a1 = new Animal();
  Herviboro *h1 = new Herviboro();
  Carnivoro *c1 = new Carnivoro();
  Omnivoro *o1 = new Omnivoro();
  cout<<"Numero de animales: "<<Animal::obtenerNumeroAnimales()<<endl;
  a1->comer();
  h1->pastar();
  //Plantas
  h1->comer();
  c1->cazar();
  //Carne
  c1->comer();
  //? Ominvoro
  //o1->Herviboro::comer(); //Plantas() de sus Padres
  //o1->Carnivoro::comer(); //Carne() de sus Padres
  o1->comer(); //En su propio constructor
  delete a1,h1,c1,o1;
  cout<<"Numero de animales: "<<Animal::obtenerNumeroAnimales()<<endl;
}

A la hora de heredar si se pone un virtual, se soluciona el problema del diamante

class Omnivoro : virtual public Herviboro, virtual public Carnivoro