Protected Konstruktor kann nicht aus abgeleiteter Klasse benutzt werden



  • Hallo,

    ich habe folgenen Code

    class Base
    {
        protected:
        Base (int, int);
        public:
        Base (int);
    };
    
    class Derived : public Base
    {
        public:
        Derived (int);
        void func (int, int);
    };
    
    Derived::Derived (int a) : Base (a)
    {
    }
    
    void Derived::func (int a, int b)
    {
        Base test(a,b);
    }
    
    int main (void)
    {
        Derived test1(3);
        test1.func(3,4);
    }
    

    Eigentlich sollte man ja aus einer abgeleiteten Klasse auf protected Elemente/Funktionen der Basis-Klasse zugreifen können, oder?

    Meine Frage, wieso geht das in dem Beispiel nicht?

    Comeau-Fehler: "ComeauTest.c", line 22: error: protected function "Base::Base(int, int)" is not
    accessible through a "Base" pointer or object
    Base test(a,b);

    Schonmal vielen Dank

    Felix



  • ich bin selber noch nicht so fit in c++, aber soweit ich das überblicke ist eine protectet-funktion nur auf this anwendbar. du willst den konstruktor aber auf ein neu erzeugtes objekt test anwenden. den protected-konstruktor kannst du also nur in der initialisierungsliste des Derived-konstruktors aufrufen.

    korrigiert mich, wenn ich falsch liege.



  • protected bedeutet, dass abgeleitete Klassen in Ihren Funktionen diese Funktionen aufrufen dürfen (für das eigenen Objekt), Du kannst aber nicht Dir ein Objekt erzeugen und dann dessen protected Methoden aufrufen (egal ob in einer abgeleiteten Klasse oder sonst wo ausserhalb der eigentlichen Klasse).
    Da hilft entweder ein friend oder den Konstruktor public machen.



  • Zur Vervollstädigung:

    11.5 Protected member access [class.protected]
    1 When a friend or a member function of a derived class references a protected nonstatic member function or
    protected nonstatic data member of a base class, an access check applies in addition to those described earlier
    in clause 11.102) Except when forming a pointer to member (5.3.1), the access must be through a
    pointer to, reference to, or object of the derived class itself
    (or any class derived from that class) (5.2.5). If
    the access is to form a pointer to member, the nested-name-specifier shall name the derived class (or any
    class derived from that class).

    Gruß


Anmelden zum Antworten