In C ++, è possibile scrivere un override per il metodo di una classe base anche se la dichiarazione di visibilità dei due non corrisponde. Quali sono le possibili considerazioni sulla progettazione in base alla decisione di non considerare la visibilità nella regola di sovrascrittura?
Considera questo pezzo di codice come un esempio:
class A{
public: virtual void f() { cout << "A::f" << endl; }
};
class B : public A {
private: void f() { cout << "B::f" << endl; }
};
int main() {
A* a = new B;
a->f();
}
Quanto sopra compila in clang, e l'esecuzione stampa B :: f, mostrando che è possibile chiamare una funzione privata di B al di fuori della classe, interrompendo così l'incapsulamento.
Non vedo davvero perché questo tipo di comportamento dovrebbe essere consentito. Non è chiaramente per ragioni di prestazioni / efficienza, dal momento che verificare staticamente che due dichiarazioni di visibilità coincidono è banale. Qualcuno ha un'idea o ipotesi su quale possa essere la decisione di progettazione dietro a questo?