Publiczna funkcja wirtualna uzyskana prywatnie w C ++

Próbowałem dowiedzieć się, co się dzieje, gdy klasa pochodna deklaruje funkcję wirtualną jako prywatną. Oto program, który napisałem

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

Zaskakująco (dla mnie) wynik był:

B constructor called
B::func called

Czy to nie narusza prywatnego zestawu dostępu dla tej funkcji. Czy to jest oczekiwane zachowanie? Czy jest to standardowe obejście lub luka? Czy poziomy dostępu są pomijane podczas rozwiązywania wywołań funkcji przez VTABLE?

Każdy wgląd w to zachowanie byłby bardzo pomocny.

Ponadto wspomniano, że prywatne nadpisanie wirtualnego członka uniemożliwi dalsze dziedziczenie klas. Nawet to ma problemy. Modyfikowanie powyższego programu w celu uwzględnienia:

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

oraz główny program testowy do:

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

wyjście to:

C::func called

questionAnswers(3)

yourAnswerToTheQuestion