Auf Protected Funktionen zugreifen


  • Mod

    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 😉


  • Mod

    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.



  • @Jockelx

    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


  • Mod

    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.



  • hustbaer schrieb:

    @Jockelx

    👍
    Stimmt, hab ich nicht dran gedacht, ist aber besser.


Anmelden zum Antworten