Funktion in Unterklasse "löschen"
-
Hey Leute,
angenommen man hat folgenden Zusammenhang
class A { public: void foo() { cout << "A" << endl;} }; class B : public A { public: void foo() {}; };und möcchte in der Unterklasse B die Methode foo() nicht mehr zur Verfügung stellen, dann fällt mir bisher nur die obige Lösung ein, schöne wäre aber so etwas wie
void foo() = delete ;was aber an dieser Stelle leider nicht möglich ist. Gibt es sonst noch elegante Möglichkeiten eine eigentlich geerbte Funktion zu löschen/verbergen?
Gruß

-
1. Design nochmal ueberdenken. In den meisten Fallen ist das naemlich nicht sinnvoll, da dadurch die 'is-a' Beziehung verletzt wird.
2. Falls du es wirklich so machen willst, dann kannst du einfach den Methodenrumpf leer lassen, das heisst die Methode macht dann nichts. Oder du wirfst eine Exception, wenn die Methode aufgerufen wird.Sind beides unschoene Loesungen aber soweit ich weiss gibt es nichts besseres. Deswegen wie schon in Punkt1 geschrieben: Design nochmals ueberdenken.
-
MatheStein schrieb:
void foo() = delete;Genau das geht mit C++11
(siehe Wikipedia)Für den alten Standard fällt mir nur ein, dass man die geerbte Funktion private deklariert und nirgends definiert...
Beispiel:
#include <iostream> struct A { void foo() { std::cout << "foo\n"; } }; class B : public A { void foo(); // EDIT: hier könnte man auch schreiben // A::foo; // wie in Hacker's Beitrag unten // Beide Schreibweisen führen bei Aufruf von B::foo() zum gleichen Fehler :-) }; int main() { A a; B b; a.foo(); b.foo(); return 0; }Visual C++ meldet hier bei b.foo():
error C2248: "B::foo": Kein Zugriff auf private Member, dessen Deklaration in der B-Klasse erfolgte.Sollte also in etwa deinem Ziel entsprechen.
PS.: Hacker, ich bin kein Dieb, ich habe deinen Namen immerhin erwähnt...

-
MatheStein schrieb:
Gibt es sonst noch elegante Möglichkeiten eine eigentlich geerbte Funktion zu löschen/verbergen?
class A { public: void foo() {} }; class B : public A { private: A::foo; };Bringt aber natürlich nichts, wenn du Basisklassenzeiger/referenzen verwendest; Dann hängt alles von
Aab.Edit: Drako du Dieb
