Если я правильно помню, есть как минимум два способа создания миксинов в C ++. Это взято из какого-то очень старого (1995) учебника, который я видел (но он почти полностью исчез из интернета).
Во-первых,
class MixinBase {
public :
void f() {};
};
template<class T>
class Mixin : public T {
public:
void f() {
T::f();
T::f();
}
};
template<class T>
class Mixin2 : public T {
public :
void g() {
T::f();
T::f();
}
};
int main() {
Mixin2<Mixin<MixinBase>> mix;
mix.g();
}
Или другой способ использует виртуальное наследование и вызовы одного брата:
class Base {
public :
virtual void f() = 0;
};
class D1 : public virtual Base {
public :
void g() {
f();
}
};
class D2 : public virtual Base {
public :
void f() {
}
};
class D : public D1, public D2 {
};
int main() {
D d;
d.g();
}
Теперь в обеих этих версиях реализованы миксины, поскольку Mixin и Mixin2 являются независимыми классами, но они все еще могут общаться. И вы можете создавать программное обеспечение из таких модулей, а затем просто связать эти модули с одним большим программным обеспечением. То же самое происходит между D1 и D2 в виртуальном наследовании. Важно отметить, что в смешанном дизайне разные модули живут внутри одного и того же объекта C ++. (ой и CRTP это другая техника)