Hallo zusammen,
ich stehe gerade an einer Art Luxus-Problem und frage mich ob ihr mir
helfen könnt dieses zu lösen.
Folgender Aufbau:
1 | #include <iostream>
|
2 |
|
3 | using namespace std;
|
4 | class Base
|
5 | {
|
6 | public:
|
7 | void fooBase() { cout << "void A::fooBase()" << endl; }
|
8 | void fooBase( char c ) { cout << "void A::fooBase( '" << c <<"' )" << endl; }
|
9 | void barBase() { cout << "void A::barBase()" << endl; }
|
10 | };
|
11 |
|
12 |
|
13 | class Derived : private Base // von Base wird privat vererbt!
|
14 | {
|
15 | public:
|
16 | using Base::fooBase; // auf Base::fooBase() soll der zugriff erlaubt sein
|
17 |
|
18 | void fooDrvd() { cout << "void B::fooDrvd()" << endl; }
|
19 |
|
20 | };
|
21 |
|
22 | int main(int /*argc*/, char */*argv[]*/)
|
23 | {
|
24 | Derived d;
|
25 |
|
26 | d.fooBase(); // <- benötigter Zugriff
|
27 | d.fooBase( 'b' ); // <- soll verboten werden
|
28 | // d.barBase(); // <- gewollt nicht erlaubt
|
29 |
|
30 | return 0;
|
31 | }
|
So mein Problem ist nun, dass ich auf fooBase() eines Derived-Objekts
zugreifen muss/möchte. Den Zugriff auf fooBase( char c ) würde ich
allerdings gerne unterbinden. Mittels "using ..." kann ich aber offenbar
nur den Zugriff auf alle Methoden der Basisklasse mit diesem Namen
freigeben.
Eine Weg der mir einfallen würde wäre eine eigene Methode
1 | void Derived::fooBase() { Base::fooBase(); }
|
zu schreiben. Das finde ich allerdings ziemlich unschön und vermutlich
auch nicht so performant. Es wäre mir lieber direkt auf die
Basisklassen-Methode zugreifen zu können.
Fällt euch dazu irgendwas ein?
Letztlich ist es ja nicht schlimm, wenn auch die unerwünschte Methode
erreichbar ist, aber vielleicht gibt es ja auch einen weg der genau das
erlaubt was ich mir vorstelle. Würde mich freuen, in dieser ecke wieder
was lernen zu können, da ich irgendwie schon häufiger auf solche
Probleme gestoßen bin, aber noch nie eine schöne Lösung gefunden habe.
Vielen Dank schonmal
lg Leo
PS: Falls ihr euch fragt, warum ich das unbedingt in der abgeleiteten
Klasse lösen möchte und nicht einfach die entsprechenden Methoden in der
Basisklasse als private deklariere und dann public vererbe: Auf die
Basisklasse habe ich keinen Zugriff. Die Existiert so schon. ;)