Frage zur Vererbung in C++
-
Hallo Leute,
es geht mit um folgendes, ich habe eine abstrakte Basisklasse mit einer privaten rein virtuellen Funktion. Kann ich in abgeleiteten Klassen diese Funktion so wie unten implementieren und verwenden oder muss ich das Schlüsselwort ändern? Normal kann man ja auf private Member nicht zugreifen.
class abstractBase { private: virtual int foo() = 0; }; class derived : public abstractBase { private: int foo() { return 0 }; }
-
Du kannst nach wie vor nicht auf private Methoden zugreifen, sie aber sehr wohl überschreiben. Ich würde dir raten, auch in abgeleiteten Klassen das
virtual-Schlüsselwort zu verwenden, um die Absicht auszudrücken. Mit C++11 kannst du auchoverrideverwenden.
-
~~Etwas privates ist, wie du schon selbst sagtest, von aussen nicht sichtbar. Sprich du kannst die Methode auch nicht implementieren. Virtuelle Funktionen privat machen, macht absolut keinen Sinn.
Wenn du die aber von außen nicht zugreifbar machen willst, kannst du sie locker protected machen. (Vllt mal als Stichwort das Template Method Pattern)~~
Edit: Siehe unten, hier steht nur falsches
-
Hier ist noch ein netter Thread zu diesem Thema
http://www.dreamincode.net/forums/topic/251975-overriding-private-and-protected-virtual-functions/
-
Doch, SkymOshO, das geht und macht durchaus Sinn (siehe NVI-Ideom),
Nexus Antwort war vielleicht nicht deutlich genug.
-
Skym0sh0 schrieb:
Virtuelle Funktionen privat machen, macht absolut keinen Sinn.
http://www.gotw.ca/publications/mill18.htm
Guideline #2: Prefer to make virtual functions private.
-
Shit, da lag ich echt mächtig daneben. oO
Ich glaub, da bin ich etwas durch Java geblendet, wo selbst Eclipse schon meckert, wenn man irgendwas privates abstrakt macht.Ja, NVI-Idiom schonmal vom Namen gehört, aber noch nie angewendet. Und den Sutter Artikel werd ich mir jetzt auch mal lesen.
Sorry Jungs...