[C++-sig] Automatic downcast question

Stefan Franke franke at ableton.com
Sat Jun 14 21:58:55 CEST 2003


After observing some strange behaviour I've extracted the toy example
below.

We have a simple inheritance relation A < B < C. The classes A and B
are wrapped, C remains unwrapped.


struct A
{
  virtual std::string classname() { return "A"; }
};


struct B : A
{
  virtual std::string classname() { return "B"; }
};


struct C : B
{
  virtual std::string classname() { return "C"; }
};

A* getA()
{
  static A* pA = new A;
  return pA;
}

A* getB()
{
  static A* pA = new B;
  return pA;
}

A* getC()
{
  static A* pA = new C;
  return pA;
}

BOOST_PYTHON_MODULE(Test)
{
  def("getA", getA, return_value_policy<reference_existing_object>());
  def("getB", getB, return_value_policy<reference_existing_object>());
  def("getC", getC, return_value_policy<reference_existing_object>());

  class_<A>("A").def("classname", &A::classname);
  class_<B>("B", bases<A>);
  // C remains unwrapped
}

----------------------

Now, in Python:

>>> from Test import *
>>> getA()
<Test.A object at 0x...>
>>> getB()
<Test.B object at 0x...>       // <<< (Superb feature, anyway!)
>>> getC()
<Test.A object at 0x...>       // <<< Why not Test.B?

>>>getC().classname()
'C'


Is there a way to make getC() return a wrapped B object instead of
a wrapped A?

This is important for my intended use of the BPL, since A and B (and
in fact many more) are wrapped API classes, whereas C (and C1, C2, ..)
are client classes that can't be exposed to BPL in advance.



Stefan
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/cplusplus-sig/attachments/20030614/b8927331/attachment.htm>


More information about the Cplusplus-sig mailing list