Sichtbarkeit bei abgeleiteten Klassen



  • Folgende Struktur:

    class Base {
      ...
      public:
        void func1() {...};
    };
    
    class A : public Base {
      ...
      public:
        void func2() {...};
    };
    
    A *a = new A();
    a->func2(); // a->func1() soll nicht sichtbar sein!
    

    Die Instanz a erhält auch die Methode func1 mitgeliefert.
    Ich möchte jedoch nur die Methode func2 aufrufen können.

    Ebenso soll in weiteren Unterklassen nur die jeweiligen Methoden der Instanz aufrufbar sein.


  • Mod

    ich frag lieber nicht was das soll.
    Möglichkeit1: mach die Vererbung private (oder protected)
    Möglichkeit2: verdecke die geerbten Funktionen durch eine private Deklaration gleichen Namens (muss keine Funktion sein) in der Subklasse. Dann sind die geerbten Funktionen allerdings immer noch durch qualifizierten Aufruf verfügbar.



  • Hallo,

    Dann mach die Methoden der Basisklasse private.



  • ch frag lieber nicht was das soll.

    👍

    @Braunstein
    Methoden sollen immer aufrufbar sein, auch die der Basisklasse.
    Also: Base *b = new Base(); b->func1();

    @camper
    Fall 1: class A : private Base {...

    Methoden von Base sind immer noch sichtbar...

    Fall 2: gefällt mir nicht, kommt mir eher als Hack vor

    Qualifizierter Aufruf ist erlaubt. Es soll nur bei einer Instanz nicht möglich sein, Methoden der Basisklassen aufrufen zu können.


  • Mod

    Zickedi schrieb:

    @camper
    Fall 1: class A : private Base {...

    Methoden von Base sind immer noch sichtbar...

    natürlich. Nur Überdeckung kann die Sichtbarkeit eines Bezeichners verhindern. Allerdings kann ein Aufrufer, der nicht zufällig friend der ableitenden Klasse ist, sdie geerbten Funktionen nicht mehr aufrufen.

    Ich frag doch lieber, was das ganze soll. Klingt wie eine Vergewaltigung des Ableitungsmechanismus.



  • Klingt wie eine Vergewaltigung des Ableitungsmechanismus.

    Ja, bin da wohl auf der falschen Fährte.

    Damit will ich ein Datenmodell abbilden.



  • Bist du wohl. Und "ein Datenmodell abbilden" ist nicht besonders umfangreiche Information, fuerchte ich.

    Wenn ich das richtig verstanden habe, willst du Klassen, die

    a) auf die Moeglichkeiten anderer Klassen zugreifen wollen (wozu sonst vererbung)
    b) jeweils eine eigene Schnittstelle haben, die Schnittstelle der benutzten KLassen aber nicht nach aussen sichtbar machen wollen.

    Da du keine Schnittstelle vererben willst udn ergo auch nicht an Polymorphie interessiert sein kannst, mach doch einfach deine "Basis" Klasse zum Member der anderen Klasse, ganz ohne Ableitung:

    class Base {
      ...
      public:
        void func1() {...};
    };
    
    class A{
      ...
      Base m_base;
      public:
        void func2() {...};
    };
    

    So kannst du auf jegliche Funktionalitaet von Base auch in A zugreifen, die Schnittstelle bzw. das Vorhandensein von Base ist aber nach aussen verborgen. Mehr scheinst du ja nicht zu wollen 🙂


Anmelden zum Antworten