You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免包装抽象基类并解决Python调用派生类基类方法的错误?

问题解答

问题2:当前调用出错的原因

这个错误确实和const正确性直接相关,和Python的隐式self无关。

C++里ABC::getid()是const成员函数,实际签名隐含了const ABC*类型的this指针;但你绑定的时候直接写&ABC::getid,Boost.Python默认会把它当成非const成员函数处理,要求传入non-const的this指针。Python传入的D1实例符合const要求,但绑定的签名不匹配,因此抛出参数错误。

问题1:不定义基类包装器,使用基类非虚方法的解决办法

不需要为抽象基类ABC编写包装器,只要在绑定派生类时,正确处理基类const成员函数的绑定逻辑即可,具体有两种可行方式:

方式一:用const_修饰符明确标注

绑定过程中通过boost::python::const_指明这是一个const成员函数:

class_<D1, D1*>("D1", "...")
  .def("getid", &ABC::getid, const_())
;

方式二:用make_function显式指定签名

通过make_function明确函数的const属性和返回值策略:

#include <boost/python/make_function.hpp>
#include <boost/python/return_value_policy.hpp>

class_<D1, D1*>("D1", "...")
  .def("getid", make_function(
    &ABC::getid,
    return_value_policy<copy_const_reference>(), // 根据需求选择返回值策略,避免悬空引用
    (const ABC*)nullptr // 指明this指针为const类型
  ))
;

完成上述绑定后,Python中调用d1.getid()即可正常工作,且无需将基类ABC暴露给Python环境。

内容的提问来源于stack exchange,提问作者MMM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 02:50:12