From reading the comments, your misunderstanding seems to be that when you create an instance of class C, there are also separate instances of classes B, A, or Object. That's not the case. There is a single object that is an instance of class C, and it may also be treated as an instance of class B, A, or Object (read up on the Liskov Substitution Principle). To modify Eric Lippert's analogy: when a dog is created (born), it is a dog, a mammal, and an animal. But there's only one dog.
Consider this (Animal, Mammal, Dog, instead of A, B, C):
public class Animal { void Breathe(); } public class Mammal : Animal { void GrowHair(); } public class Dog { void Bark(); }
This inheritance chain gives the following effect:
public class C { void Breathe(); void GrowHair(); void Bark(); }
In terms of fields, and going back to A, B, C, consider this:
public class A { private int _a; } public class B: A { private int _b; } public class C: B { private int _c; }
How does an instance of A look in memory? Some number of bytes of overhead, plus four bytes for _a:
OVERHEAD _a : four bytes
How does an instance of B look in memory? It looks just like an instance of A plus four more bytes:
OVERHEAD _a : four bytes _b : four bytes
And an instance of C looks like an instance of A plus eight more bytes:
OVERHEAD _a : four bytes _b : four bytes _c : four bytes
What's that overhead? Not surprisingly, that's the stuff defined by the Object class! So every time you add another class to the inheritance chain, the fields defined in that class are just tacked onto the end of the memory structure of its parent class.
An instance of a derived class does not refer to the data defined by its parent class; it contains the data defined by its parent class.