Boost.Python中的基类和派生类

时间:2015-05-14 20:00:06

标签: python c++ inheritance boost

我有两个类 - 比如说A和B.B类是A的子类,都有函数H,这样:

 our_singer.php

派生类B是:

class A{
  public:
  A(){;;}  // ctor
  virtual ~A(){ ;; } // destr.
  virtual double H(int i,int j){ 
    std::cout<<"Calling the base function H. Level is too abstract\n";
    exit(0);
    return 0.0;
  }// H
};// class A

我还有一个接受A类类型参数的函数:

class B : public A{
  public:
  B(){;;}  // ctor
  ~B(){ ;; } // destr.
  double H(int i,int j){ 
    return 1.0;
  }// H
};// class B

我想在Python中使用派生类型B的对象作为此函数的参数。因此,我按照here所解释的那样导出了两个类和函数:

double f(A x){
  return x.H(1,1); 
}

所以在Python中我做了:

BOOST_PYTHON_MODULE(modAB){
  class_<A>("A", no_init);

  class_<B, bases<A> >("B", init<>())
    .def("H", &B::H)
  ;    

  def("f", &f);
}

作为输出,我看到方法H是从基类调用的,而不是像我预期的那样从派生类调用:

>>> from modAB import *
>>> x = B()
>>> res = f(x)

所以,我的问题是我错了,我可能错过了什么?

1 个答案:

答案 0 :(得分:2)

<script type="text/javascript"> function treeViewDrop(dropEvent) { var treeView = $("#ourTreeView").data("kendoTreeView"); var destination = treeView.dataItem(dropEvent.destinationNode); var source = treeView.dataItem(dropEvent.sourceNode); if (!(destination && destination.parentID == source.parentID)) { dropEvent.setValid(false); } } </script> 按值传递double f(A x),因此传递x类型的对象会将其派生的虚函数分开。

要解决此问题,您需要传递B

const A&