Ну, раз уж такое дело пошло и нас учат корректно запрещать создавать объекты в стеке, я тоже свои пять копеек оставлю.
Итак, есть класс A:
[c++]
struct A: virtual some_base_class, some_other_class {
virtual f();
};
[/c++]
При записи берем и пишем объект этого класса целиком в поток:
[c++]
A *a = new A();
...
stream.write((const char *) a, sizeof(A));
[/c++]
Теперь, внимание, самое интересное.
Теперь мы читаем класс из потока, пусть нам извсетно что этот класс -- A. Сначала мы заводим буффер, считываем туда блок памяти, а потом конструируем класс в этом буфере с помощью placement new.