Весь смысл наследования в том, что экземпляр класса B можно использовать и как экземпляр класса A (но не наоборот). Если из B удалить какой-то атрибут, то что будет с наследованием? Если просто пытаться его как-то скрыть, то это не поможет - ведь можно приведением типов экземпляр класса B превратить в экземпляр класса A и получить обратно свой доступ к нужному полю.
И вообще, вот, например, есть библиотека, которая умеет работать с объектами класса A. Библиотека скомпилирована кем-то, её исходный код недоступен. Мы определяем класс-потомок B и далее используем функции библиотеки на объектах этого класса. Всё хорошо, но мы уже не можем запретить библиотеке работать с этим полем.
PS: В своё время намного лучше понять ООП мне помогло чтение описания внутреннего устройства классов в Turborland Pascal. Устроены классы (в Pascal они называются объектами, но это не столь важно) примерно так:
1. Ссылка на таблицу виртуальных методов (VMT)
2. Поле 1.
3. Поле 2.
...
VMT устроена так:
1. Ссылка на метод 1
2. Ссылка на метод 2
...
Наследуемый класс отличается от исходного тем, что у него более длинный список полей (но все поля исходного имеются в наличии и находятся по тем же самым смещениям), а также отличаются адреса переопределённых методов, плюс сама таблица VMT может быть длинее за счёт добавленных новых методов (но те же самые старые методы находятся по тем же смещениям).
За счёт этого даже уже ранее скомпилированный код, ничего не знающий о наследуемых классах, работает с ними как со своими родными.