使用虚拟保护方法继承

时间:2015-11-13 12:42:51

标签: c++ swig

我正在尝试用swig将一些类从c ++包装到c#,它的工作非常好 突然,我试着打电话给某个方法,我的程序崩溃了 我的类流程看起来像这样(只有重要的类): c ++代码:

class B
{
public:
    virtual void f1();
protected:
    int f2();
};
class D:public B
{
public:
    virtual void f1();
protected:
    float f3();
};

这个类使swig为每个类生成一个SwigDirector 在我的c#代码中,我尝试做这样的事情:
public class Foo:D { void callF2Meth() { this.f2(); } }

  

在d.f2()上抛出异常;   在swig生成调用f2的方法的代码看起来像这样(没有初始化):    arg1 = (Base *)jarg1; darg = dynamic_cast<SwigDirector_B *>(arg1); result = (int)(darg)->f2();   
  抛出异常是因为arg1是SwigDirector_D的类型,它不是从SwigDirector_B继承而是从D继承(也不是从SwigDirector_B继承而是从B继承)    
  swig代码:

  %module(directors="1", allprotected="1") SwigExample
  %{
  #include "Base.h"
  #include "Derived.h"
  %}
  %feature("director") Base;
  %feature("director") Derived;
  %include "Base.h"
  %include "Derived.h"

所以我做了一些调试,我意识到swig试图将D的SwigDirector转换为B巫婆的SwigDirector,而不是在同一层次结构中。
如何告诉swig正确包装类?

1 个答案:

答案 0 :(得分:0)

这似乎是SWIG中已知的限制/错误(请参阅SWIG-mailinglist上的问题)。我选择通过实现D :: f2(){return B :: f2();来解决这个问题。 }。