Почему body «не перекрывает» p?
Потому что в спеке отдельной графой так описано. Про специфичность. 

Стили непосредственно соответствующих элементов всегда предпочитаются унаследованным стилям, независимо от специфичности унаследованного правила

Чтобы уложить в голове, нужно нарочито утрировать и посмотреть как это работает:

snippet
z индекс?