Wie kann ich erzwingen, dass eine Basisklassenmethode nicht von einer abgeleiteten Klasse überschrieben wird?Wie kann verhindert werden, dass eine Methode in der abgeleiteten Klasse überschrieben wird?
Antwort
Wenn Sie die Methode nicht virtuell machen, können abgeleitete Klassen die Methode nicht überschreiben. Eine Klasse kann jedoch eine Methode aus einer Basisklasse nicht überschreiben und außerdem verhindern, dass weitere abgeleitete Klassen die gleiche Methode überschreiben (). Sobald die Methode virtuell ist, bleibt sie virtuell.
+1: Der Teil jedoch war der Schlüssel für mich. – imallett
mit C++ 11 können Sie final
Specifier verwenden, um zu vermeiden, dass eine Methode in abgeleiteten Klassen überschrieben wird –
tharinduwijewardane
gut, wenn Sie es öffentlich halten möchten, deklarieren Sie es nicht virtuell.
BEARBEITEN: Srikanth kommentierte Fragen über das Überschreiben einer privaten Elementfunktion in einer abgeleiteten Klasse.
class A
{
public:
virtual ~A(){};
void test()
{
foo();
};
private:
virtual void foo()
{
std::cout << "A";
};
};
class B : public A
{
public:
virtual void foo()
{
std::cout << "B";
};
};
void test()
{
B b;
A& a = b;
a.test(); // this calls the derived B::foo()
return 0;
}`
Abgeleitete Klassen können weiterhin virtuelle private Memberfunktionen überschreiben. –
Ich habe bearbeitet, danke für die Korrektur. –
aber wie können wir eine private Methode überschreiben, ohne die abgeleiteten einen Freund oder die Zugriffsspezifizierer – sriks
Machen Sie es nicht virtuell.
Dies verhindert nicht, von Ihrer Klasse abzuleiten und die Funktion zu verbergen (indem eine andere Mitgliedsfunktion mit demselben Namen bereitgestellt wird). Wenn Ihre Klasse jedoch nicht dazu bestimmt ist, abgeleitet zu werden (kein virtueller Destruktor, keine virtuellen Memberfunktionen), sollte das kein Problem darstellen.
soweit ich weiß kann man das nicht auf C++ machen, man kann versuchen es als privat zu deklarieren. . Finden Sie mehr Informationen über diesen Link http://en.allexperts.com/q/C-1040/prevent-overriding-functions-derived.htm
Abgeleitete Klassen können weiterhin virtuelle private Elementfunktionen überschreiben. –
Kurze Antwort: Es gibt keine Notwendigkeit dafür. Lange Antwort können Sie some twists tun, aber ist es das wert?
Wenn Sie den Spezifizierer final
aus C++ 11 verwenden können, können Sie verhindern, dass abgeleitete Klassen diese Methode überschreiben. (Microsoft-Compiler erscheinen die ähnliche sealed
mit ähnlichen Semantik zu unterstützen.)
Hier ist ein Beispiel:
#include <iostream>
struct base {
// To derived class' developers: Thou shalt not override this method
virtual void work() final {
pre_work();
do_work();
post_work();
}
virtual void pre_work() {};
virtual void do_work() = 0;
virtual void post_work() {};
};
struct derived : public base {
// this should trigger an error:
void work() {
std::cout << "doing derived work\n";
}
void do_work() {
std::cout << "doing something really very important\n";
}
};
int main() {
derived d;
d.work();
base& b = d;
b.work();
}
Hier ist, was ich bekomme, wenn ich versuche, es zu kompilieren:
$ g++ test.cc -std=c++11
test.cc:17:14: error: virtual function ‘virtual void derived::work()’
test.cc:5:22: error: overriding final function ‘virtual void base::work()’
Frage: Warum sollte ich "work()" als "virtuell" deklarieren, wenn ich nicht möchte, dass es in abgeleiteten Klassen überschrieben wird - warum nicht einfach als endgültig markieren? – Sonic78
@ Sonic78 Gute Frage!In realem Code haben Sie möglicherweise eine andere Basisklasse namens "base", die eine virtuelle Funktion bereitstellt, die in Klassen, die von Ihrer Zwischenbasis stammen, nicht überschrieben werden soll. – moooeeeep
- 1. Kann eine statische Methode in der abgeleiteten Klasse überschrieben werden?
- 2. Wie verhindert man, dass eine Funktion in Python überschrieben wird
- 3. Wie erzwinge ich, dass eine Methode in Java überschrieben wird?
- 4. Wie verhindert man, dass eine Methode in Java überlastet wird?
- 5. DBGrid: Wie kann verhindert werden, dass eine Zeile ausgewählt wird?
- 6. Wie kann verhindert werden, dass eine WPF-App geladen wird?
- 7. Wie verhindert Python, dass eine Klasse unterklassifiziert wird?
- 8. Wie kann verhindert werden, dass Dateien überschrieben werden, wenn sie mit Java gelesen und verarbeitet werden?
- 9. Kann eine Methode mit einem abgeleiteten Parameter anstelle einer Basis überschrieben werden?
- 10. Wie kann der Operator [] überschrieben werden?
- 11. Wie stellen Sie sicher, dass Sie eine Methode in einer abgeleiteten Klasse in C++ überschrieben (versteckt) haben?
- 12. Welche Methode wird überschrieben?
- 13. Wie kann verhindert werden, dass ein Modul zweimal importiert wird?
- 14. Wie kann verhindert werden, dass div umgebrochen wird?
- 15. Wie kann der standardmäßige Fensterabschlussvorgang überschrieben werden?
- 16. Kann verhindert werden, dass eine Klasse im RAII-Stil "anonym" instanziiert wird?
- 17. Kann ich verhindern, dass eine geerbte virtuelle Methode in Unterklassen überschrieben wird?
- 18. Wie kann verhindert werden, dass Flexboxen schrumpfen?
- 19. eine konstante Methode der Basisklasse von der abgeleiteten Klasse
- 20. Warum die ToString() -Methode überschrieben werden kann, ohne dass eine Vererbung an C# beteiligt ist?
- 21. Wie kann verhindert werden, dass Eigenschaften zwischen Widgets freigegeben werden?
- 22. Wie kann sichergestellt werden, dass die Methode toString() in der Klasse neu implementiert wird?
- 23. Kann eine native Methode in einer Java-Klasse in Android/dalvik überschrieben werden?
- 24. Wie kann verhindert werden, dass JPA Transaktionen rückgängig macht?
- 25. Wie verhindert man, dass Ihre Klasse in C++ vererbt wird?
- 26. Wie wird ein Datenelement der Basisklasse aufgerufen, wenn es als Eigenschaft in der abgeleiteten Klasse überschrieben wird?
- 27. Wie wähle ich aus, welche Java-Überladung in einer von Kotlin abgeleiteten Klasse überschrieben werden soll?
- 28. abgeleiteten Klasse die falsche Methode
- 29. Verhindern, dass CSS überschrieben wird
- 30. WiX: Wie kann verhindert werden, dass ein Registrierungswert bei der Deinstallation entfernt wird?
nicht Zwing es virtuell in der Basisklasse? Dann kann es nicht überschrieben, nur überladen werden. Es gibt kein direktes Äquivalent zu Javas "finalen" Methoden, wenn das die Frage ist. –
also ohne Verwendung eines virtuellen Schlüsselwortes können wir es nicht machen, also wie haben sie in JAVA dann implementiert – sriks
in Java, Kennzeichnung eine Methode 'final' verbietet Unterklassen von der Implementierung dieser Methode, und der Compiler und/oder Byte-Code-Verifikator wird dies erzwingen . In C++ gibt es keine Möglichkeit, es zu verbieten, es ist nur so, dass per Definition von "override" nur virtuelle Funktionen "überschrieben" werden können. –