kein Zugriff auf protected Eigenschaft



  • Hallo,
    ich habe keine Erklärung dafür, warum ich nicht auf die protected Eigenschaft "DataLink" aus der Klasse TCustomDBGrid zugreifen kann.
    In einer abgeleiteten Klasse müßte eigentlich der Zugriff auf protected - Member einer Basis-Klasse möglich sein.

    Bitte schaut Euch folgendes Konstrukt an. Kann mir jemand den Grund sagen, warum es nicht klappt?

    //h
    class  __declspec(delphiclass) TnewGrid;   //forward Deklaration
    
    class TClassA : public TCustomEdit {
    private:
      TnewGrid* FGrid; 
    protected:
      DYNAMIC void __fastcall f(void); 
    ...
    }
    //-------------------------------------
    class TClassB : public TCustomDBGrid {
    ...
    }
    //-------------------------------------
    class TnewGrid : public TClassB {
    ...
    }
    //-------------------------------------
    
    //cpp
    void __fastcall TClassA::f(void){
    ...
      if (FGrid->DataLink->Active)  //kein Zugriff auf DataLink, warum?
    ...
    }
    

    Unter Builder2009-Hilfe finde ich TCustomDBGrid Member -> Protected Eigenschaften -> C++
    __property TGridDataLink DataLink;

    PS: in einem C++-Buch finde ich einen Hinweis auf "using":

    //wenn ich TClassB von oben abändere
    class TClassB : public TCustomDBGrid {
    public:
      using TCustomDBGrid::DataLink; //so würde es funktionieren, aber es wird gleichzeitig davon abgeraten?!
    ...
    }
    


  • Hallo

    Deine Klasse TClassA ist nicht von TnewGrid abgeleitet, deshalb kannst du von Methoden der Klasse TClassA nicht auf protected-Member von TnewGrid zugreifen.

    Vom using wird abgeraten, weil es eben die normale Datenkapselung umgeht, die man mit public/protected/private eigentlich anstrebt. Das macht den Quellcode schwerer nachzuvollziehbar (den Compiler stört das aber nicht). Der ordentliche und vorzuziehende Weg ist immer, alle von außen abrufbare Member als public zu deklarieren. Nur in absoluten Notfällen (Die Zielklasse kann von dir nicht verändert werden) sollten solche "Hacks" verwendet werden.

    bis bald
    akari



  • Und daran ändert auch die forward Deklaration

    class  __declspec(delphiclass) TnewGrid;
    

    nichts?



  • Hallo

    Nein, eine FD ändert weder an der Vererbungshierachie noch an der Sichtbarkeit (public/protected/private) etwas.

    bis bald
    akari



  • @akari, vielen Dank für die Info.


Log in to reply