Zu allererst Ihr Derived::fun()
ist auch virtual
, denn wenn eine Funktion in einer abgeleiteten Klasse die gleiche Erklärung wie eine virtuelle Funktion in der Basisklasse hat, automatisch die Funktion in abgeleiteten Klasse virtual
bekommt, auch wenn diese nicht explizit waren angegeben.
Zweitens ist es völlig in Ordnung, auf private virtuelle Funktionen über öffentliche Zwischenfunktionen aus der Basisklasse zuzugreifen, siehe z. B. this answer und seine Links, insbesondere Virtuality by Herb Sutter. Ein Codebeispiel sein könnte wie
#include<iostream>
using namespace std;
class Derived;
class Base {
private:
virtual void fun() { cout << "Base Fun"; }
public:
void funInt() { fun(); }
};
class Derived: public Base {
private:
virtual void fun() { cout << "Derived Fun"; }
};
int main()
{
Base *ptr = new Derived;
ptr->funInt();
return 0;
}
Also, was in Ihrem Fall geschieht, denke ich, ist eine ähnliche Situation: der main
darf ptr->fun()
zugreifen, aber aufgrund Virtua diese fun()
geschieht Derived::fun()
zu sein.
UPD: auf einen Kommentar erweitern
Aber nicht dieser Ton ein wenig alarmierend ..Ich meine, alle Funktionen , die von der Basisklasse ableiten, werden ihre private Mitglieder zugänglich den Freund Funktionen der Basisklasse haben
Nein, nicht alle Funktionen von Derived
werden den Freunden zugänglich sein, Base
, aber nur diejenigen, die über Base
Zeiger erreichbar sind. Zum Beispiel:
int main() {
Derived *ptr = new Derived;
Base* baseptr = ptr;
baseptr->fun(); // ok, calls Derived::fun()
baseptr->foo(); // error, no such function in Base
ptr->foo(); // error, foo is private
return 0;
}
anzumerken, dass virtual
Funktion absichtlich erweiterbare und jede Überschreibung von virtual
Funktion in Derived
bedeutet, dass die Funktion kann über Base
genannt werden:
class Base {
virtual void fun();
friend int main();
}
class Derived: public Base {
virtual void fun();
virtual void foo();
void bar();
}
nur Derived::fun()
können vom Haupt zugegriffen werden Zeiger; Dies ist der Hauptzweck von virtual
Funktionen. Wenn Derived
seine vorrangige Funktion private
macht, sollte es immer noch bewusst sein, dass die Funktion über Base
Zeiger zugegriffen werden kann, denn das ist die Grundidee hinter den virtual
Funktionen.
Freunde haben Zugang zu privaten Mitgliedern. Du deklarierst den Main als Freund, also hast du Zugriff auf private Mitglieder. (Warum hast du das getan ist ein Wunder für mich) – user463035818
@ tobi303, Freund hat Zugriff auf private von 'Base' nicht' Derived' und die 'fun()' aufgerufen wird, wenn das Programm ausgeführt wird, ist 'fun()' der 'Derived' Klasse .. BTW ich spielte mit C++ Konzepten herum, so dass ich auf dieses Problem stieß ... nichts Praktisches .. – Haris