No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Herencia múltiple

14/16
Recursos

Aportes 8

Preguntas 4

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

o inicia sesión.

Una situación que puede y es muy probable que suceda, es el conocido como “Problema 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.

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

class Omnivoro : virtual public Herviboro, virtual public Carnivoro