Mixin是来自Lisp的一个概念。下面引用自Dr. Dobbs中的很好的解释:
Mixin是类的一个片段,它旨在与其他类或mixin组合使用。
[...]
常规独立类(例如Person)和mixin的区别在于,mixin对某些小的功能切片进行建模(例如打印或显示),并且不适用于独立使用。相反,它被设计为与需要该功能的其他类(例如Person)组合使用。
因此,mixin的目的是允许类似于多重继承的东西,而没有通常伴随多重继承的所有问题。
然而,这可能有点令人困惑,因为C++并不原生支持mixin;为了在C++中实现mixin,您必须使用多重继承!实际上,这意味着您仍然使用多重继承,但人为地限制了您允许自己使用它的范围。
请参阅上面的文章以获取实际的mixin实现。
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();
}
Mixin2 const&
传递给函数?客户端只能是函数模板,其中(mixin)参数作为模板参数传递吗?您能否提供一些示例,说明如何利用Mixin2<Mixin1<T>>? - Grim FandangoMixin是一个类(或其他代码组)的名称,旨在通过直接包含在另一段代码中来实现重用。可以将其视为没有子类型多态性的继承。CRTP是在C ++中近似Mixin的一种方式。