Función virtual pública derivada privada en C ++

Estaba tratando de averiguar qué sucede cuando una clase derivada declara que una función virtual es privada. El siguiente es el programa que escribí.

#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;
}

Sorprendentemente (para mí) la salida fue:

B constructor called
B::func called

¿No está esto violando el conjunto de acceso privado para esa función? ¿Es este el comportamiento esperado? ¿Se trata de una solución estándar o laguna? ¿Se omiten los niveles de acceso al resolver llamadas de función a través de VTABLE?

Cualquier información sobre este comportamiento sería de gran ayuda.

Además, se mencionó que una anulación privada de un miembro virtual evitaría que otras clases lo heredaran. Incluso esto está teniendo problemas. Modificando el programa anterior para incluir:

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

y el programa de prueba principal para:

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

la salida es:

C::func called

Respuestas a la pregunta(3)

Su respuesta a la pregunta