C code, which of course is unaware of object semantics, can access the data members of a C++ object directly, but certain requirements must be met. There are some guarantees about the underlying memory layout of an object. C code can take advantage of these guarantees and treat a C++ object as an ordinary data struct, provided that all the following restrictions apply to the class of the object in question:
- The class has no virtual member functions (including inherited virtual functions of a base class).
- The class has no virtual base classes in the entire inheritance chain.
- The class has no member objects that have either a virtual base class or virtual member functions.
- All the data members of the class are declared without an intervening access specifier.
The compatible memory layout of C++ objects and C structs has many useful applications. For example, it enables relational databases to retrieve and insert objects into a database table. Data Manipulation Languages, such as SQL, that do not support object semantics, can still treat a “live” object as a raw chunk of memory. In fact, several commercial databases rely on this compatibility to provide an object-oriented interface with an underlying relational data model. Another application is the capability to transmit objects as a stream of bytes from one machine to another.