Boost.Python教程:类的继承

版权声明:本文为博主原创文章,欢迎转载(请声明出处),私信通知即可 https://blog.csdn.net/xinqingwuji/article/details/89185702

在前面的示例中,我们处理的是非多态的类。通常情况并非如此。大多数时候,我们将包含通过继承相关的多态类和类层次结构。我们经常需要为从抽象基类派生的类编写Boost.Python包装器。
考虑这个简单的继承结构:

struct Base { virtual ~Base(); };
struct Derived : Base {};

及在Base和Derived对象实例上运行的一组C ++函数:

void b(Base*);
void d(Derived*);
Base* factory() { return new Derived; }

我们已经看到了如何包装基类Base:

class_<Base>("Base")
    /*...*/
    ;

现在我们可以通知Boost.Python Derived和它的基类Base之间的继承关系。从而:

class_<Derived, bases<Base> >("Derived")
    /*...*/
    ;


这样做,我们免费获得一些东西:

Derived自动继承Base的所有Python方法(包装的C ++成员函数)
如果Base是多态的,
通过指针或对Base的引用传递给Python的派生对象可以在需要指向Derived的指针或引用的位置传递。
现在,我们将公开C ++免费函数b和d以及工厂:

def("b", b);
def("d", d);
def("factory", factory);


请注意,正在使用自由函数工厂生成类Derived的新实例。在这种情况下,我们使用return_value_policy <manage_new_object>来指示Python采用指向Base的指针并将实例保存在新的Python Base对象中,直到Python对象被销毁。我们稍后会看到更多的Boost.Python调用策略。

// Tell Python to take ownership of factory's result
def("factory", factory,
    return_value_policy<manage_new_object>());


 

https://github.com/Lxxing/PythonStudy

猜你喜欢

转载自blog.csdn.net/xinqingwuji/article/details/89185702