Class members have private access by default. Apart from that there is no difference between a struct or a class. Again, you write them to work with the data in their class. In C, when calling a function which operates on a structure, you pass a pointer to that structure. Within the function, your code dereferences the pointer for each member access.
Virtual methods are methods that are called using a single level of indirection.
The compiler maintains a table of pointers to virtual methods in the background for you. When you write a call to a virtual method, the compiler automatically generates a call through the pointer for that method. This allows you to change the pointer to point to a new method later - in case you want to add new behavior without rewriting the old library. It's powerful, once you get used to it. The source code is more clean, much easier to read than the equivalent in C would be.