First a "Why is it like that?"
I should point out WHY structs are supported in C++.
Remember the point of C++ is twofold, first as an object oriented language, but ALSO as a "better C" with stronger type checking and a lot of other benefits. But, to remain backwards compatible (and, indeed to improve upon this backwards compatibility), structs were left in.
Also remember that the original C++ was cfront, which was essentially a pre-compiler for C. Anything that you could do in the original C++ you could do in C, it was just painful to do so and there were no guarantees without a mechanism to enforce the rules.
With that in mind let's look at the differences, once again.
Use struct when you want the members to be public BY DEFAULT (bad form, never assume defaults). But, also use a struct when you really want something that behaves like a C struct. It generally has very few methods if any and it generally has no operators. That's not a requirement of the language, it's just considered good form by many, if not most, C++ programmers. If you really want all of the functionality of a class, use a class.
A struct and a class are the same except for access (both in the declaration as well as in derived objects).
Example:
class A
{
int i;
};
struct B
{
int j;
};
class C : A
{
// i is private to A.
};
struct D : B
{
// j is public
};