boost.python -- 继承 (2)

先前翻译过一篇boost.python 继承方面的官方教程,现在自己研究了下,发现了一些问题。

首先我的boost直接使用官方给的安装工具,在线下载了所需的二进制dll,直接使用的,出现了一些问题,比如c++中使用printf和cout输出的内容全不可见,然后我想了个折衷的办法,将输出的内容写文件,反正编译的时候没少生成很多小的碎文件,也不在乎多这一个。

就举其中例子吧:

void write2Log( char * str )
{
	FILE * output = fopen( "log.txt" , "ab");
	fprintf( output , str );
	fclose( output);
}
struct Base
{
    virtual ~Base() {}
    virtual int f() { write2Log("====4====\n"); return 0; }
};

struct BaseWrap : Base, wrapper<Base>
{
    int f()
    {
		write2Log("====1====\n");
        if (override f = this->get_override("f"))
            return f(); // *note*
		write2Log("====2====\n");
        return Base::f();
    }


    int default_f() {		write2Log("====3====\n");
		 return this->Base::f(); }
};
class_<BaseWrap, boost::noncopyable>("Base")
	.def("f", &Base::f, &BaseWrap::default_f);

调用 时使用的Python脚本:

a = hello.Base()
a.f()

class Derived( hello.Base):
        def f(self):
                print 'hello world'

b = Derived()
b.f()

super( Derived , b ).f()


运行结果:

0 
hello world
0
记录信息:
**************new test****************
====4====
====4====


然后发现了几个问题,boost.python这样的写虚函数的意义何在?

1.python中父子函数重名,子类函数一定会覆盖父类函数,同名函数只能存在一个。子类直接覆盖就好了,使用super函数直接可以调用父类函数,这样大费周张写boost.python有什么作用?

2.看暴露函数的部分,

class_<BaseWrap, boost::noncopyable>("Base")
	.def("f", &Base::f, &BaseWrap::default_f);
使用python调用时,给出两个可选项,&Base::f和 &BaseWrap::default_f , 唯独没有&BaseWrap::f , 而这个函数正是我们费半天劲写的,却没有提供给python调用,这是为什么?

3.接下来是最精髓的了,我把暴露的函数变了变

class_<BaseWrap, boost::noncopyable>("Base")
	.def("f", &BaseWrap::default_f, &BaseWrap::f);默认先调用后面的
然后调用
super( Derived , b ).f()
python给我回答:
RuntimeError: maximum recursion depth exceeded while calling a Python object

记录信息:

====1====
====1====
====1====
====1====
...

这回确实调用到了


4.直接

	class_<Base, boost::noncopyable>("oldBase")
		.def("f", &Base::f);
调用的结果,和写那一堆效果一样。

彻底无语了,作者这样设计,一定有它的作用,可我还是暂时无法理解。

没办法,尽量把c++的代码当模块调用,不要打算继承了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值