Auf Protected Funktionen zugreifen
-
Nochmals ein Beispiel das genau dem von oben entspricht:
#include <iostream> using namespace std; class Base { public: Base() { cout << "Base Konstruktor\n"; } ~Base() { cout << "Base Dekonstruktor\n"; } public: void show() { cout << "Show() from Base\n"; } protected: void show_protect() { cout << "Show() protected\n"; } }; class Derivate : public Base { public: Derivate() { cout << "Derivate Konstruktor\n"; } ~Derivate() { cout << "Derivate Dekonstruktor\n"; } }; int main() { cout << "Test"; Derivate foo; foo.show(); foo.show_protect(); return 0; }Ich möchte jetzt auf die Protected Funktion mit foo zugreifen.
Hmmm vllt steh ich auch einfach auf m Schlauch grad.
-
Wenn du meinst, die Klassenhierarchie deiner Bibliothek hacken zu müssen, dann stimmt entweder was mit der Bibliothek nicht oder du hast nicht verstanden, wie sie richtig zu benutzen ist. Was hier der Fall ist, kann ich nicht beurteilen, ohne die riesig lange Doku zu lesen. Erfahrungsgemäß würde ich davon ausgehen, dass die Entwickler von großen Bibliotheken meistens recht gut wissen, was sie tun.
-
Hey,
ich will das doch nicht Hacken
hab auch andere Möglichkeiten, zb. diese Datei wieder zu schließen und neu zu öffnen. Aber ich dachte, dass das etwas umständlich ist und es mit den eingebauten Funktionen schon passt.Nur kurz eine Frage bezüglich meinem Beispiel.
Kann Derivate nicht die protected Funktion von Base aufrufen? Denn wenn ich deine Aussage richtig auffasseDu kannst halt einfach eine eigene Klasse von Base erben lassen und lustig mit den protected-Membern rumspielen, wie es dir passt. Daher sieht man protected auch eher selten, da es effektiv darauf hinaus läuft, als sei es das gleiche wie public.
sollte ich mit der abgeleiteten Klasse doch auf die protected Member zugreifen können.
Danke nochmals für die Antwort.
-
Shor-ty schrieb:
sollte ich mit der abgeleiteten Klasse doch auf die protected Member zugreifen können.
Ja, das ist möglich. Das ist der Sinn von protected.
-
Danke dann hab ichs ja doch richtig verstanden.Dann frag ich mich aber wieso mein Beispiel (drei Posts bevor) nicht kompiliert werden kann?
-
Shor-ty schrieb:
Danke dann hab ichs ja doch richtig verstanden.Dann frag ich mich aber wieso mein Beispiel (drei Posts bevor) nicht kompiliert werden kann?
Dieses?
IFstream foo("Path"); string line; while(!foo.eof()) { is.getLine(line); Info<< "While loop 1: << line << "\n"; } foo.setGood(); // Problem foo.rewind; while(!foo.eof()) { is.getLine(line); Info<< "While loop 2: << line << "\n"; }Bloß weil meine Kinder daheim an meinen geschützten Teilen rumspielen dürfen, darf das noch lange nicht jeder Fremde, der meine Kinder irgendwie kennt. Er kann sie aber fragen, ob sie nicht in seinem Namen daheim an meinen geschützten Teilen rumspielen wollen.
(Nach dieser Analogie erwarte ich, dass mir gleich ein Sondereinsatzkommando die Bude stürmt
)
-
Hi,
möglicherweise kommt die KSK zu dir

Nein das Beispiel meinte ich nicht. Ich meinte das hier:
#include <iostream> using namespace std; class Base { public: Base() { cout << "Base Konstruktor\n"; } ~Base() { cout << "Base Dekonstruktor\n"; } public: void show() { cout << "Show() from Base\n"; } protected: void show_protect() { cout << "Show() protected\n"; } }; class Derivate : public Base { public: Derivate() { cout << "Derivate Konstruktor\n"; } ~Derivate() { cout << "Derivate Dekonstruktor\n"; } }; int main() { Derivate foo; foo.show(); foo.show_protect(); return 0; }Da Derivate von Base abgeleitet ist und die Funktion "show_protect()" als protected deklariert wurde, sollte ich doch mit dem Objekt der Klasse Derivate darauf zu greifen können.
-
Nee, dieses (ist näher an 3)

Änderungen scon eingebaut:#include <iostream> using namespace std; class Base { protected: void show_protect() { cout << "Show() protected\n"; } }; class Derivate : public Base { public: void show_protect() { Base::showProtect();} }; int main() { cout << "Test"; Derivate foo; foo.show(); foo.show_protect(); return 0; }Du kannst nur innerhalb der abgeleiteten Klasse auf die protected member zugreifen.
-
Hey,
jetzt hats klick gemacht

Danke dir. D.h. ich brauch ne Funktion innerhalb der abgeleiteten Klasse, die mir quasi die protected Funktion aufruft.Dann mach ich mich gleich mal auf die Suche

Nochmals Danke und ich hoffe das kein Sonderkommando zu dir nach Hause kommt
-
Ja, du kannst aus Memberfunktionen von Derivate auf die protected-Member von Base zugreifen. Die protected Member von Base werden dadurch aber keine public Member von Derivate. Für jeden, der nicht von Base oder Derivate erbt, verhalten sie sich so, als seien sie private.
Es hält halt bloß niemand einen davon ab, eine eigene Klasse zu schreiben:
class GetProtectedAccess : public Base { public: void access() { show_protect(); } };Wodurch sich im Endeffekt jeder Zugriff auf die protected-Member verschaffen kann, wenn er möchte.
-
class Base { protected: void show_protect() { ... } }; class Derivate : public Base { public: //void show_protect() { Base::showProtect();} using Base::show_protect; // tut's auch };
-
Das stimmt, aber ich nehme an in diesem numerischen Bereich möchte niemand eine Klasse erstellen um auf Diskretisierungsmethoden zugreifen zu müssen.
Ich habe eine Funktion gefunden, die mich auf die std::istream Funktionalitäten zugreifen lässt (wie dumm ich auch bin). Damit kann ich also
is.std::istream.clear()aufrufen und mein Problem hat sich damit gelöst

Danke aber nochmals für die Erklärung. Ist etwas in den Hintergrund gerutscht.SChönen Abend noch,
Tobi
-
Shor-ty schrieb:
Ich habe eine Funktion gefunden, die mich auf die std::istream Funktionalitäten zugreifen lässt (wie dumm ich auch bin). Damit kann ich also
is.std::istream.clear()aufrufen und mein Problem hat sich damit gelöst

Das habe ich mir schon fast gedacht, dass solch eine Funktion existieren muss, habe sie bloß nicht in der Dokumentation gefunden. Man könnte fast zu dem Schluss kommen, jemand hätte die C++-Standardbibliothek 1:1 nachprogrammiert

-
Joa die haben vieles Nachprogrammiert und eben neu definiert.
Bspw. ist ein:vector<type> List<type>Oder ein Double -> Scalar.
-
