Forum: PC-Programmierung [c++] Überschreiben geerbter methoden verbieten


von Vlad T. (vlad_tepesch)


Lesenswert?

Hi,
Ich habe eine Basisklasse:
1
class Foo
2
{
3
public:
4
 virtual void process() = 0;
5
}

nun ist es notwendig das process zu unterteilen und eine neue 
Basisklasse bereitzustellen.
1
class MultiFoo: public Foo
2
{
3
public:
4
 virtual void processA(){};
5
 virtual void processB(){};
6
private:
7
 virtual void process()
8
 {
9
   if(rand()%2){
10
     processA();
11
   }else{
12
     processB();
13
   }
14
 };
15
}
die Klassen, die von MultiFoo ableiten sollen aus naheliegenden Gründen 
gezwungen werden, die process unangetastet zu lassen und mindestens eine 
der beiden processA oder processB zu implementieren.

folgendes soll also verhindert werden:
1
class Bar: public MultiFoo
2
{
3
public: 
4
 void process(){  // hier hätte ich gerne einen compiler fehler.
5
   cout << 42;
6
 }
7
  
8
}

ein verschieben von process nach private brachte leider nicht den 
erhofften Erfolg. private von Foo erben kann ich leider aus anderen 
Gründen nicht.

gibts sonst noch eine Möglichkeit, außer auf Goodwill der Anwender zu 
hoffen, was immer kein sehr befriedigender Ansatz ist.

Gruß
Vlad

von Nicht Thomas (Gast)


Lesenswert?

Schlüsselwort
1
final

von Vlad T. (vlad_tepesch)


Lesenswert?

Nicht Thomas schrieb:
> Schlüsselwort
1
final

Vlad Tepesch schrieb:
> [c++]

von asdf (Gast)


Lesenswert?

In C++11 gibt es erst das Schlüsselwort final. Keine Ahnung, wie man es 
in älteren C++ Versionen löst

von tata (Gast)


Lesenswert?


von Vlad T. (vlad_tepesch)


Lesenswert?

das verbietet ja das Ableiten von der Klasse.

von Mark B. (markbrandis)


Lesenswert?

Dann wird es wohl nicht gehen, gleichzeitig diese drei Bedingungen zu 
erfüllen:
-Kein C++11 Compiler
-Ableiten soll möglich sein
-Geerbte Methoden nicht verändern dürfen (bzw. eine bestimmte)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.