acessando um membro protegido de uma classe base em outra subclasse

Por que isso compila:

class FooBase
{
protected:
    void fooBase(void);
};

class Foo : public FooBase
{
public:
    void foo(Foo& fooBar)
    {
        fooBar.fooBase();
    }
};

mas isso não acontece?

class FooBase
{
protected:
    void fooBase(void);
};

class Foo : public FooBase
{
public:
    void foo(FooBase& fooBar)
    {
        fooBar.fooBase();
    }
};

Por um lado, o C ++ concede acesso a membros privados / protegidos para todas as instâncias dessa classe, mas por outro lado, não concede acesso a membros protegidos de uma classe base para todas as instâncias de uma subclasse. Isso parece bastante inconsistente para mim.

Eu testei compilar com VC ++ e com ideone.com e ambos compilar o primeiro, mas não o segundo trecho de código.

questionAnswers(7)

yourAnswerToTheQuestion