<!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 < B < 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> virtual std::string classname() { return "A"; }</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> virtual std::string classname() { return "B"; }</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> virtual std::string classname() { return "C"; }</FONT>
<BR><FONT SIZE=2>};</FONT>
</P>
<P><FONT SIZE=2>A* getA()</FONT>
<BR><FONT SIZE=2>{</FONT>
<BR><FONT SIZE=2> static A* pA = new A;</FONT>
<BR><FONT SIZE=2> 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> static A* pA = new B;</FONT>
<BR><FONT SIZE=2> 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> static A* pA = new C;</FONT>
<BR><FONT SIZE=2> 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> def("getA", getA, return_value_policy<reference_existing_object>());</FONT>
<BR><FONT SIZE=2> def("getB", getB, return_value_policy<reference_existing_object>());</FONT>
<BR><FONT SIZE=2> def("getC", getC, return_value_policy<reference_existing_object>());</FONT>
</P>
<P><FONT SIZE=2> class_<A>("A").def("classname", &A::classname);</FONT>
<BR><FONT SIZE=2> class_<B>("B", bases<A>);</FONT>
<BR><FONT SIZE=2> // 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>>>> from Test import *</FONT>
<BR><FONT SIZE=2>>>> getA()</FONT>
<BR><FONT SIZE=2><Test.A object at 0x...></FONT>
<BR><FONT SIZE=2>>>> getB()</FONT>
<BR><FONT SIZE=2><Test.B object at 0x...> // <<< (Superb feature, anyway!)</FONT>
<BR><FONT SIZE=2>>>> getC()</FONT>
<BR><FONT SIZE=2><Test.A object at 0x...> // <<< Why not Test.B?</FONT>
</P>
<P><FONT SIZE=2>>>>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>