Função virtual pública derivada privada em C ++

Eu estava tentando descobrir o que acontece quando uma classe derivada declara uma função virtual como privada. O seguinte é o programa que eu escrevi

#include <iostream>
using namespace std;
class A
{
    public:
        virtual void func() {
        cout<<"A::func called"<<endl;
    }
    private:
};
class B:public A
{
    public:
    B()
    {
        cout<<"B constructor called"<<endl;
    }
    private:
    void func() {
        cout<<"B::func called"<<endl;
    }
};
int main()
{
    A *a = new B();
    a->func();
    return 0;
}

Surpreendentemente (para mim) a saída foi:

B constructor called
B::func called

Isso não está violando o acesso privado definido para essa função? Este é o comportamento esperado? Esta é uma solução padrão ou lacuna? Os níveis de acesso são ignorados ao resolver chamadas de função através do VTABLE?

Qualquer insight nesse comportamento seria muito útil.

Além disso, foi mencionado que um membro virtual que substituísse privadamente impediria que outras classes o herdassem. Mesmo isso está tendo problemas. Modificando o programa acima para incluir:

class C: public B
{
    public:
    void func() {
        cout<<"C::func called"<<endl;
    }
};

e o principal programa de testes para:

int main()
{
    A *a = new C();
    a->func();
    return 0;
}

a saída é:

C::func called

questionAnswers(3)

yourAnswerToTheQuestion