#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
.