Понимание этого кода C++. Изменения наследования и области действия

Я наткнулся на это в одном из постов на SO. Мне трудно понять следующий код.

class A 
{
public:
    virtual void foo() = 0;
private:
    virtual void bar() = 0;
};

class B : public A 
{
private:
    virtual void foo() 
    {
        std::cout << "B in Foo \n";
    } 
public:
    virtual void bar() 
    {
        std::cout << "bar in Foo \n";
    } 
};

void f(A& a, B& b)
{
    a.foo(); // ok --->Line A
    //b.foo(); // error: B::foo is private
    //a.bar(); // error: A::bar is private
    b.bar(); // ok (B::bar is public, even though A::bar is private) --> Line B
}

int main()
{
    B b;
    f(b, b);
}

Теперь я хотел знать, как возможна линия А? Обычно classA будет интерфейсом, и вы не сможете создать его экземпляр. Вы сможете только создать экземпляр его реализации. Я был бы признателен, если бы кто-нибудь мог объяснить мне, что здесь происходит.

Обновлять :

можно ли рассматривать a в LineA как реализацию b ?


person Rajeshwar    schedule 19.09.2014    source источник
comment
Вы должны прочитать большинство ответов на этот вопрос: C++: переопределение общедоступных \частное наследство   -  person WhozCraig    schedule 19.09.2014
comment
Я немного не понимаю здесь - вы спрашиваете, почему можно принять чистый виртуальный базовый класс в качестве параметра?   -  person Shog9    schedule 22.09.2014