<p>在Python中,只需做一点工作,就可以完成您想要的事情。它如您所希望的那样工作,因为在Python中,由于函数的返回类型(或通常的类型)不是强类型的,因此我们可以修改您的<code>Entity::component</code>函数以始终返回最派生的类型,而不管它是什么。在</p>
<P>为用C++ + Python绑定实现这项工作,您需要为^ {CD1>}编写一个“OUT”类型映射。我写了一个例子来说明它的工作原理。在这种情况下,我们必须稍微预兆一下,因为知道将它向下转换到什么位置的唯一方法来自函数的参数。(例如,如果基类有一个以字符串/枚举形式返回的方法,则可以进一步简化该方法,而不依赖于输入参数)。在</p>
<pre class="lang-cpp prettyprint-override"><code>%module test
%{
#include "test.hh"
%}
%include <std_string.i>
%typemap(out) Component * Entity::component {
const std::string lookup_typename = *arg2 + " *";
swig_type_info * const outtype = SWIG_TypeQuery(lookup_typename.c_str());
$result = SWIG_NewPointerObj(SWIG_as_voidptr($1), outtype, $owner);
}
%include "test.hh"
</code></pre>
<p>这使用<code>SWIG_TypeQuery</code>函数要求Python运行时基于arg2查找类型(在您的示例中是字符串)。在</p>
<p>我必须对你的示例标题(名为测试.hh在我的示例中)为了在我将其制作成一个完全正常工作的演示之前解决一些问题,它最终看起来像:</p>
^{pr2}$
<p>然后我用:</p>
^{3}$
<p>有了这一点,我可以运行以下Python:</p>
<pre><code>from test import *
e=Entity()
print(e)
c=e.component("DerivedComponent")
print(c)
print(type(c))
c.update()
c.speak()
</code></pre>
<p>正如您所希望的那样:</p>
<pre class="lang-none prettyprint-override"><code><test.Entity; proxy of <Swig Object of type 'Entity *' at 0xb7230458> >
Name is: DerivedComponent *, type is: 0xb77661d8
<test.DerivedComponent; proxy of <Swig Object of type 'DerivedComponent *' at 0xb72575d8> >
<class 'test.DerivedComponent'>
DerivedComponent::update()
DerivedComponent::speak()
</code></pre>