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.
-
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.
-
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
