C++ typ nowej zmiennej "odziedziczony" po jednym z rodziców

0

Witam,

Muszę napisać program, jednym z jego funkcji jest "parowanie" obiektów, które mają wspólną klasę bazową, ale niekoniecznie pochodzą z tej samej klasy,a następnie utworzenie obiektu "dziecka" które jest typu jednego z rodziców. Nie jestem zbyt biegły w C++, ale szukałem niestety bezskutecznie. Ma ktoś jakiś pomysł? A może jest jakieś gotowe rozwiązanie?

0

Napisz w pseudokodzie przykład użycia. Brzmi jak abstrakcyjna fabryka.

0

Powiedzmy mamy klasę A i z niej dziedziczą B1, B2, B3, B4
Tworzymy po 2 obiekty Bn i dobieramy w pary.
Następnie dla każdej pary tworzymy nowy obiekt typu Bn, gdzie n jest numerem któregoś rodzica

1

Śmieszny problem :D O to chodziło?

#include <iostream>
#include <memory>
#include <vector>
#include <ctime>
#include <cstdlib>
using namespace std;

struct A 
{
    virtual void greet() const { cout << "I'm A" << endl; }
};

struct B1 : public A 
{
    virtual void greet() const override { cout << "I'm B1" << endl; }
};

struct B2 : public A 
{
    virtual void greet() const override { cout << "I'm B2" << endl; }
};

struct B3 : public A 
{
    virtual void greet() const override { cout << "I'm B3" << endl; }
};

struct B4 : public A 
{
    virtual void greet() const override { cout << "I'm B4" << endl; }
};

template<typename Mother, typename Father>
unique_ptr<A> createChild(const Mother&, const Father&)
{
	if (rand() % 2 == 0)
		return make_unique<Father>();
	else
		return make_unique<Mother>();
}

int main()
{
	srand(time(0));
	
	createChild(B1(), B2())->greet();
	createChild(B1(), B3())->greet();
	createChild(B1(), B4())->greet();
	createChild(B2(), B3())->greet();
	createChild(B3(), B4())->greet();
	
	return 0;
}
0

Dziękuję bardzo, ale pojawiają się kolejne problemy. Powiedzmy, że są 3 warstwy klas: Z A dziedziczy B C i D. Z B dziedziczy B1,B2,B3, z C C1 i C2, a z D D1 i D2. Tylko klasy z numerkiem nie są abstrakcyjna. Każda ma jakieś swoje pola. I teraz dziecko ma dziedziczyć wartości pól po rodzicach, jak mają takie same pola to jest wybierana średnia, a jak oboje rodzice nie posiadają tego pola to jest przepisywane od tego drugiego rodzica.

1
#include <iostream>
#include <string>
#include <random>
using namespace std;

using Str = string;

template<typename StrT = Str>
struct A{ 
	using Str = StrT;
	using CStrRef = const StrT &;
	A(CStrRef name): name(name){} 
	void greet(){ cout << "I am " << name << endl; }
	Str name;
};

struct B1:A<>
{ B1(): A<>("B1"){}};
struct B2:A<>
{ B2(): A<>("B2"){}};
struct B3:A<>
{ B3(): A<>("B3"){}};
struct B4:A<>
{ B4(): A<>("B4"){}};

template<
	typename OmniParent,
	typename Parent1, 
	typename Parent2, 
	typename URNG
>
inline OmniParent breed(URNG &urng, double chance){
	bernoulli_distribution dist(chance);
	return dist(urng)? (OmniParent)Parent1():(OmniParent)Parent2();
}


int main(){
	using A = A<>;
	default_random_engine gen;
	breed<A, B1, B2>(gen, 0.1).greet();
	breed<A, B1, B3>(gen, 0.2).greet();
	breed<A, B1, B4>(gen, 0.3).greet();
	breed<A, B2, B3>(gen, 0.4).greet();
	breed<A, B3, B4>(gen, 0.5).greet();
	return 0;
}

//EDIT: tak w ramach poprzedniego; Nie lubię wirtualnych metod.
+

a jak oboje rodzice nie posiadają tego pola to jest przepisywane od tego drugiego rodzica

Jeśli oboje tego nie mają, to jakim cudem ma to wziąć od drugiego? on też nie ma tego pola.

0

Pomyłka. Chodzi o to, że wartości pól które ma jeden rodzic są przepisywane od niego.

1 użytkowników online, w tym zalogowanych: 0, gości: 1