Marcus MacWilliam wrote:
Hello,
My previous post contained a minimal example, which was incomplete, deliberately so as not to bloat the post with code. However Jeff Flynn has requested a minimal code example.
I have attached several files for classes to this e-mail.
BaseClass - the base class, which has a serialize method DerivedClass - a sub-class with its own serialize method InstantiableClass - the class actually instantiated from DerivedClass Main - code example of the client/server that serializes and de-serializes the InstantiableClass object. Our system automatically inserts some pre-compiled headers so to get the code to compile you may need to add your own #includes.
The output from the main program is this:
Serializing... BOOST: I am an Instantiable class object BOOST: I am in BaseClass::serialize De-serializing... BOOST: I am an Instantiable class object BOOST: I am in BaseClass::serialize Assertion failed: dynamic_cast
(object).getCom() == 20, file Main.cc, line 8 This highlights the polymorphism problem in a nutshell. The overloaded what() method is telling me that in both the client and server code the objects is an InstantiableClass object. However the Derived::serialize is not being called on either side. Thus the data (m_com) from the DerivedClass is not being serialized and is lost.
The compiler, and debugger, is telling me my object is an InstantiableClass, however when boost calls serialize on the object, the code in the BaseClass and not the Derived class is being called.
Any help greatly appreciated.
At first I thought this was obvious. But now I look at this I would have thought it would work. I'm thinkinig it's related to the member function look up rules associated with virtual member functions. In any case, try the following: a) in BaseClass.h what(); to what() = 0; This will detect any non-obvious copying (slicing) which might be occurring. b) in InstantiableClass add a serialize function which only incudes only base object serialization. c) tweak your main test program so that it doesn't use InstantiableClass but rather DerivedClass directly. Does that work? Robert Ramey