Coming from a C++ background, this came as a surprise to me. In C++ it\'s good practice to make virtual functions private. From http://www.gotw.ca/publications/mill18.htm: \
Because C# does not have any mechanism for providing public/private/protected inheritance, which is what you are actually after.
Even in C++, private members cannot be accessed by derived classes, but they can limit the base class visibility by specifying inheritance visibility:
class Derived : /*->>*/private/*<--*/ Base {
}
C# provides a whole bunch of other things in order for you to control the visibility of your class' members. Between protected and internal, you should be able to get the hierarchy exactly as you want.
IMHO C# enforces stronger IS-A relationship via single base class inheritance, so it makes sense that if a car has an engine, a BMW subclass shouldn't be able to hide it.
C++ supports multiple inheritance which is a less stricter IS-A relationship - it's almost like a HAS-A relationship where you can bring in multiple unrelated classes. Because of the ability to bring in multiple base classes, you want tighter control over the visibility of all of them.