returning base class pointer from function

jfdeford at my-deja.com jfdeford at my-deja.com
Thu Dec 7 23:46:37 CET 2000


Okay, this is likely an easy one for somebody who
understands even a little bit about Python (this
apparently leaves me out).  I have built an
extension dll in C++, and via SWIG have the
appropriate shadow classes and such for the
various objects.  The situation is as follows: a
member function of one of my SWIGed C++ classes
returns a base class pointer (say class A) to an
object that is derived from A (class B : public
A).  Specifically, I have the following member
function declared in one of my classes:

	virtual A*	GetObject(const char
*pcPath, bool bCopyData);


wherein an object of type B is created and
returned (this function can return any one of a
number of objects that are all derived from A).
I can convince SWIG to create the appropriate
object (B) via Py_BuildValue prior to returning
it from the GetObject function in question (using
a typemap), and the shadow class just passes out
the object it gets from the wrapped GetObject
call, i.e. in the body of the shadow class
definition I find,

    def GetObject(self,arg0,arg1):
        val = pyordatac.PyORDatabase_GetObject
(self.this,arg0,arg1)
        return val

When I make an assignment at the command line
like:

foo=blah.GetObject(....)

foo is nominally of "type" B, but it seems that I
can't use it to access functionality in B, e.g.,
foo.<func only in B>() gives me an attribute
error.  In C++ I would just cast the pointer to
the appropriate derived type - is this my only
option here?  If I do the following:

boo=swigged_B_classPtr(foo)

where swigged_B_classPtr is the shadow class
associated with my B class, then I can get at the
B class member functions.  I'd rather avoid
this "cast" step if possible, and I don't really
know what it's doing anyway.





Sent via Deja.com http://www.deja.com/
Before you buy.



More information about the Python-list mailing list