如何让 Swig 发出 C++ 超类

Posted

技术标签:

【中文标题】如何让 Swig 发出 C++ 超类【英文标题】:How to enable Swig to emit C++ super class 【发布时间】:2017-07-26 04:03:20 【问题描述】:

我尝试在 Python 中使用覆盖函数,它们是 Cpp 类的一部分。

class  A 

    public:
      int func()  return 0; ;
      A();
;

class  B : A 
public:
  B();
  ~B();
;

我使用以下命令生成 Swig python 文件

swig  -python -fvirtual -modern -keyword -w511 -module a_swig -outdir . -c++  -I. a_swig.i

但是我看到这个 python 文件正在生成:

class A(object):
 thisown = _swig_property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc='The membership flag')
 __repr__ = _swig_repr

 def func(self):
    return _iris_swig.A_func(self)

 def __init__(self):
    this = _A_swig.new_A()
    try:
        self.this.append(this)
    except __builtin__.Exception:
        self.this = this
 __swig_destroy__ = _A_swig.delete_A
 __del__ = lambda self: None

A_swigregister = _A_swig.A_swigregister
A_swigregister(A)

class B(object):
  thisown = _swig_property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc='The membership flag')
__repr__ = _swig_repr

  def __init__(self, *args, **kwargs):
    this = _A_swig.new_B(*args, **kwargs)
    try:
        self.this.append(this)
    except __builtin__.Exception:
        self.this = this
  __swig_destroy__ = _iris_swig.delete_B
  __del__ = lambda self: None
packet_header_iris_swigregister = _iris_swig.packet_header_iris_swigregister
packet_header_iris_swigregister(packet_header_iris)

我希望看到 B 从 A 扩展,以便我可以在 python 中使用 b.func()

class B (A):
...

我有什么遗漏的吗?

【问题讨论】:

【参考方案1】:

B 类仅私下继承自 A,因此 SWIG 无法在 Python 中表示。将其更改为公共继承,您将看到您希望的关系。

【讨论】:

以上是关于如何让 Swig 发出 C++ 超类的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SWIG 从 C++ 调用 Java?

Swig - 结构的 C++ 向量以及如何连接它们

如何在 swig 接口文件中集成可以抛出 MyException 的 C++ 函数

如何在 SWIG 中为 c++ 创建模板函数?

在 SWIG 中将结构从 C++ 函数返回到 Python

SWIG:如何将 C++ 对象数组从 C# 传递到 C++?