在使用SWIG工具和控制器的C ++扩展派生的python类中,多态性失败

时间:2015-06-02 13:05:34

标签: python c++ polymorphism swig

我有一些第三方C ++扩展代码,我希望在我的python代码中使用。所以我开始使用SWIG来帮助,它非常好地支持C ++。正如SWIG在http://www.swig.org/Doc1.3/SWIGDocumentation.html#Python_directors上所说,它可以支持多态,所以我使用了以下代码,但是我遇到了一些奇怪的问题。

我有这样的c ++ .h代码:

class A
{
public:
    virtual void foo(){std::cout<<"A foo"<<endl;};
};

class B
{
public:
    A *a = nullptr;
};

extern A *g_a;

我有这样的c ++ .cpp代码:

A *g_a = nullptr;

我的.i文件是这样的:

%module(directors="1") A    
%{
#include "A.h"
extern A *g_a;
%}    
%feature("director") A;
%include "A.h";

我的py文件是这样的:

import A  

class ASub(A.A):
    def __init__(self):
        super(ASub, self).__init__()

    def foo(self):
        super(ASub, self).foo()
        print "ASub foo"

if __name__ == "__main__":
    bb = A.B()
    bb.a = ASub()
    bb.a.foo()       # only print "A foo", but no "ASub foo"

    A.cvar.g_a = ASub()
    A.cvar.g_a.foo() # this line will give three random results when run in
                     # serveral times, 1) the python interpreter crashes, 
                     # 2) gives a traceback saying it has no attribute, 
                     # 3) just print "A foo", without "ASub foo"

通常我希望我能用各种方式调用ASub.foo的“A foo”和“ASub foo”,但它没有像我预期的那样工作。任何人都可以帮忙解释一下吗?

但是方式,下面的代码有效!为什么?? !!

//c++, which is in module A
void update(A *a)
{
    a->foo();
}
//python
my_a = ASub()
A.update(my_a)

上面的代码给出了“A foo”和“ASub foo”。我真的很困惑!

0 个答案:

没有答案