Öffentliche virtuelle Funktion, die in C ++ privat abgeleitet wurde

Ich habe versucht herauszufinden, was passiert, wenn eine abgeleitete Klasse eine virtuelle Funktion als privat deklariert. Das Folgende ist das Programm, das ich geschrieben habe

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

Überraschenderweise (für mich) war die Ausgabe:

B constructor called
B::func called

Verstößt dies nicht gegen den für diese Funktion festgelegten privaten Zugriff? Ist das das erwartete Verhalten? Ist dies eine Standardumgehung oder eine Lücke? Werden die Zugriffsebenen umgangen, wenn Funktionsaufrufe über VTABLE aufgelöst werden?

Jeder Einblick in dieses Verhalten wäre sehr hilfreich.

Ferner wurde erwähnt, dass ein privates Überschreiben eines virtuellen Mitglieds verhindern würde, dass weitere Klassen es erben. Auch das hat Probleme. Änderung des obigen Programms um:

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

und das Haupttestprogramm um:

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

Ausgabe ist:

C::func called

Antworten auf die Frage(3)

Ihre Antwort auf die Frage