<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=us-ascii">
<META NAME="Generator" CONTENT="MS Exchange Server version 6.0.4417.0">
<TITLE>Automatic downcast question</TITLE>
</HEAD>
<BODY>
<!-- Converted from text/plain format -->

<P><FONT SIZE=2>After observing some strange behaviour I've extracted the toy example</FONT>

<BR><FONT SIZE=2>below.</FONT>
</P>

<P><FONT SIZE=2>We have a simple inheritance relation A &lt; B &lt; C. The classes A and B</FONT>

<BR><FONT SIZE=2>are wrapped, C remains unwrapped.</FONT>
</P>
<BR>

<P><FONT SIZE=2>struct A</FONT>

<BR><FONT SIZE=2>{</FONT>

<BR><FONT SIZE=2>&nbsp; virtual std::string classname() { return &quot;A&quot;; }</FONT>

<BR><FONT SIZE=2>};</FONT>
</P>
<BR>

<P><FONT SIZE=2>struct B : A</FONT>

<BR><FONT SIZE=2>{</FONT>

<BR><FONT SIZE=2>&nbsp; virtual std::string classname() { return &quot;B&quot;; }</FONT>

<BR><FONT SIZE=2>};</FONT>
</P>
<BR>

<P><FONT SIZE=2>struct C : B</FONT>

<BR><FONT SIZE=2>{</FONT>

<BR><FONT SIZE=2>&nbsp; virtual std::string classname() { return &quot;C&quot;; }</FONT>

<BR><FONT SIZE=2>};</FONT>
</P>

<P><FONT SIZE=2>A* getA()</FONT>

<BR><FONT SIZE=2>{</FONT>

<BR><FONT SIZE=2>&nbsp; static A* pA = new A;</FONT>

<BR><FONT SIZE=2>&nbsp; return pA;</FONT>

<BR><FONT SIZE=2>}</FONT>
</P>

<P><FONT SIZE=2>A* getB()</FONT>

<BR><FONT SIZE=2>{</FONT>

<BR><FONT SIZE=2>&nbsp; static A* pA = new B;</FONT>

<BR><FONT SIZE=2>&nbsp; return pA;</FONT>

<BR><FONT SIZE=2>}</FONT>
</P>

<P><FONT SIZE=2>A* getC()</FONT>

<BR><FONT SIZE=2>{</FONT>

<BR><FONT SIZE=2>&nbsp; static A* pA = new C;</FONT>

<BR><FONT SIZE=2>&nbsp; return pA;</FONT>

<BR><FONT SIZE=2>}</FONT>
</P>

<P><FONT SIZE=2>BOOST_PYTHON_MODULE(Test)</FONT>

<BR><FONT SIZE=2>{</FONT>

<BR><FONT SIZE=2>&nbsp; def(&quot;getA&quot;, getA, return_value_policy&lt;reference_existing_object&gt;());</FONT>

<BR><FONT SIZE=2>&nbsp; def(&quot;getB&quot;, getB, return_value_policy&lt;reference_existing_object&gt;());</FONT>

<BR><FONT SIZE=2>&nbsp; def(&quot;getC&quot;, getC, return_value_policy&lt;reference_existing_object&gt;());</FONT>
</P>

<P><FONT SIZE=2>&nbsp; class_&lt;A&gt;(&quot;A&quot;).def(&quot;classname&quot;, &amp;A::classname);</FONT>

<BR><FONT SIZE=2>&nbsp; class_&lt;B&gt;(&quot;B&quot;, bases&lt;A&gt;);</FONT>

<BR><FONT SIZE=2>&nbsp; // C remains unwrapped</FONT>

<BR><FONT SIZE=2>}</FONT>
</P>

<P><FONT SIZE=2>----------------------</FONT>
</P>

<P><FONT SIZE=2>Now, in Python:</FONT>
</P>

<P><FONT SIZE=2>&gt;&gt;&gt; from Test import *</FONT>

<BR><FONT SIZE=2>&gt;&gt;&gt; getA()</FONT>

<BR><FONT SIZE=2>&lt;Test.A object at 0x...&gt;</FONT>

<BR><FONT SIZE=2>&gt;&gt;&gt; getB()</FONT>

<BR><FONT SIZE=2>&lt;Test.B object at 0x...&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // &lt;&lt;&lt; (Superb feature, anyway!)</FONT>

<BR><FONT SIZE=2>&gt;&gt;&gt; getC()</FONT>

<BR><FONT SIZE=2>&lt;Test.A object at 0x...&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // &lt;&lt;&lt; Why not Test.B?</FONT>
</P>

<P><FONT SIZE=2>&gt;&gt;&gt;getC().classname()</FONT>

<BR><FONT SIZE=2>'C'</FONT>
</P>
<BR>

<P><FONT SIZE=2>Is there a way to make getC() return a wrapped B object instead of</FONT>

<BR><FONT SIZE=2>a wrapped A?</FONT>
</P>

<P><FONT SIZE=2>This is important for my intended use of the BPL, since A and B (and</FONT>

<BR><FONT SIZE=2>in fact many more) are wrapped API classes, whereas C (and C1, C2, ..)</FONT>

<BR><FONT SIZE=2>are client classes that can't be exposed to BPL in advance.</FONT>
</P>
<BR>
<BR>

<P><FONT SIZE=2>Stefan</FONT>
</P>

</BODY>
</HTML>