Открытая виртуальная функция, производная от C ++

Я пытался выяснить, что происходит, когда производный класс объявляет виртуальную функцию как закрытую. Ниже приведена программа, которую я написал

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

Удивительно (для меня) результат был:

B constructor called
B::func called

Разве это не нарушает частный доступ, установленный для этой функции. Это ожидаемое поведение? Это стандартный обходной путь или лазейка? Обходятся ли уровни доступа при разрешении вызовов функций через VTABLE?

Любое понимание этого поведения было бы очень полезно.

Кроме того, было упомянуто, что частный переопределение виртуального члена предотвратит его наследование другими классами. Даже у этого есть проблемы. Модификация вышеуказанной программы, чтобы включить:

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

и основная программа испытаний для:

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

вывод:

C::func called

Ответы на вопрос(3)

Ваш ответ на вопрос