The fourth restriction on the legality of accessing C++ objects from C code states that all the data members of the class must be declared without an intervening access specifier. This means, theoretically, that the memory layout of a class that looks similar to this example might differ from a class that has the same data members, which are declared in the same order, albeit without any intervening access specifiers:
class AnotherDate // has intervening access specifiers{ private: int day;private: int month;private: int year;public: //constructor and destructor AnotherDate(); //current date ~AnotherDate(); //a non-virtual member function bool isLeap() const; bool operator == (const Date& other);};
In other words, for class AnotherDate, an implementation is allowed to place the member ‘month’ before the member ‘day’, ‘year’ before ‘month’, or whatever. Of course, this nullifies any compatibility with a C struct. However, in practice, all current C++ compilers ignore the access specifiers and store the data members in the order of declaration. So C code that accesses a class object that has multiple access specifiers should work, but there is no guarantee that the compatibility will remain in the future.