Boost.Python 包装层次以避免菱形继承

2 投票
2 回答
803 浏览
提问于 2025-04-15 22:28

我在使用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++ 常见问题解答,了解一些说明和这意味着什么。

撰写回答