acceder a un miembro protegido de una clase base en otra subclase

¿Por qué compila esto?

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

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

¿Pero esto no?

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

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

Por un lado, C ++ otorga acceso a miembros privados / protegidos para todas las instancias de esa clase, pero por otro lado no otorga acceso a miembros protegidos de una clase base para todas las instancias de una subclase. Esto me parece bastante inconsistente.

He probado la compilación con VC ++ y con ideone.com y ambos compilan el primer fragmento de código, pero no el segundo.

Respuestas a la pregunta(7)

Su respuesta a la pregunta