我有多个c ++类继承如下:
struct RefCounterBase
{
virtual ~RefCounterBase(){}
....
};
struct A : public virtual RefCounterBase{
virtual void method_a(){...}
};
struct B : public virtual RefCounterBase{
virtual void method_b(){...}
};
class Concrete : public A, public B{
virtual void method_concrete(){...}
};
一些基于RefCounterBase
template <class T>
struct SmartPtr{
...
}
以下代码在boost 1.55中描述了python中的Concrete声明
boost::python::class_<
Concrete,
boost::python::bases<A,B>,
SmartPtr<Concrete>,
boost::noncopyable>("Concrete", "some doc", boost::python::no_init)
.def("method_concrete", &Concrete::method_concrete, "Some doc")
最后我有一些工厂返回A
的实例。在python代码中,我检查了实例是B
并需要调用method_b
。我收到如下错误:
'A' object has no attribute 'method_b'
看起来我的问题与Boost Python: polymorphic container?所描述的问题几乎相同,但我无法以提议的方式修复它。
更新:我添加了诊断打印件,以确定从我的工厂返回的内容 - 结果类型为A
,
type(a_inst).mro()
返回[<class 'A'>, <class 'Boost.Python.instance'>, <class 'object'>]
- 这意味着boost在编译时无法解析正确的信息