Boost.Python 包装层次以避免菱形继承
我在使用Boost.Python的时候遇到了一些麻烦,想要把一系列的类包装起来,但又不想搞得继承关系很复杂。假设我有三个类A、B和C,它们的结构如下:
struct A {
virtual void foo();
virtual void bar();
virtual void baz();
};
struct B : public A {
virtual void quux();
};
struct C : public A {
virtual void foobar();
};
我想把这些类A、B和C都包装起来,让它们可以在Python中被扩展。通常实现这个目标的方法是这样的:
struct A_Wrapper : public A, boost::python::wrapper<A> {
//dispatch logic for virtual functions
};
对于类B和C,它们是从A继承过来的,我希望能够继承并共享A的包装实现。所以我想做的事情大概是这样的:
struct B_Wrapper : public B, public A_Wrapper, public boost::python::wrapper<B> {
//dispatch logic specific for B
};
struct C_Wrapper : public C, public A_Wrapper, public boost::python::wrapper<C> {
//dispatch logic specific for C
}
不过,这样做似乎会引入很多麻烦,比如在B_Wrapper和C_Wrapper对象中,会出现对boost包装基类的双重继承和对A的双重继承。这种情况有没有什么常见的解决办法呢?
谢谢。
2 个回答
1
我遇到过完全一样的问题,我只是没有让B_Wrapper继承A_Wrapper(直接复制粘贴就能满足我的需求)。
我觉得可以通过一个辅助类来共享共同的实现:
template<class ADERIVED>
struct A_Implem: public ADERIVED, public wrapper<ADERIVED>
{
// dispatch logic
};
然后:
struct A_Wrapper: public A_Implem<A>
{
// ...
};
struct B_Wrapper: public A_Implem<B>
{
// ...
};
1
一种方法是进行虚拟继承:
struct B : virtual public A, ... { };
struct C : virtual public A, ... { };
struct A_Wrapper : virtual public A, ... { };
可以查看相关的 C++ 常见问题解答,了解一些说明和这意味着什么。