Não é uma quebra do encapsulamento.
Veja bem, a classe A pode acessar todo e qualquer conteúdo privado de um objeto da classe A, correto? Afinal, o privado é para objetos da própria classe.
Entretanto, embora sua instância seja de B, vale lembrar que a relação de herança estabelecida diz que a classe B é um A. Ou seja, todo objeto da classe B é também um objeto da classe A (o contrário não é verdadeiro).
Portanto, a classe A, pode acessar os membros privados de B, desde que sejam declarados na própria classe A. É como se A conseguisse ver “a metade A de B”. Isso porque, repetindo, todo B é também um A.
E até onde eu me lembro, o C++ também não é uma implementação muito fiel da OO. Por lá existem classes “friend” e castings que simplesmente violam o bom senso (tal como um carro de dados byte[] qualquer para uma classe, desde que o número de bytes “combine”). Além do fato de você poder ter métodos não polimórficos fazendo “shadowing” e criando a situação estranha do comportamento dele mudar de acordo com o tipo da variável que o referencia…
Não estou desmerecendo o C++. Por mim, é uma das melhores linguagens já inventadas, só quero ressaltar que ela não pode ser colocada como um parâmetro de uma excelente implementação dos conceitos OO.
No java também não gosto da abordagem do encapsulamento em termos de pacotes… tudo é público num mesmo pacote, exceto o private.
Violar ou não o encapsulamento, no caso da OO, está mais relacionado ao projeto de seu sistema, não tanto em como a linguagem implementa os modificadores de acesso. Uma vez que a linguagem tenha o suporte básico aos modificadores publicos, privados e protegidos, você pode implementar o encapsulamento e não serão detalhes de interpretação da regra como esses que irão comprometer o seu sistema.
O fato é que, tem gente encapsulando pouco e xunxando em todas as linguagens e assim como existem sistemas muito coesos e encapsulados em ambas as linguagens.