You create an abstract class with a subclass for each kind of thing. You use virtual functions in the abstract class for the functions, implementing them in each subclass as appropriate for each kind of thing.
A virtual function is a function that logically belongs to a class C, but that can only be defined in subclasses because insufficient information is available in class C.
If C is a concrete class then it is possible to create an object that is tagged as having class C. That is not possible when C is a abstract class.
When an object needs a function, it goes to the dispatcher to get the function. The dispatcher is part of the run-time support. It maintains a dispatch table that tells, for each class C and function name f, where the implementation of function f for class C is found.
With single inheritance, a class can only have one base class. With multiple inheritance, a class can have several base classes. (The base class of class C is the class that C extends directly.)
Yes. It can only have one base class.
Data fields are inherited by position. A given variable will always be located at the same place relative to the beginning of the memory that represents the object.
A protected data field is visible in a class and in all of its subclasses. A private data field is only visible within a single class, not in its subclasses.
Other objects of the same class can see the private data fields of an object.