Ist es möglich, meine Member-Funktionen final
wie in Java zu machen, so dass die abgeleiteten Klassen sie nicht überschreiben können?Wie definiere ich "final" member Funktionen für eine Klasse
Antwort
Es ist so viel möglich, dass es in der Tat das Standardverhalten ist. I.e. Wenn Sie Ihre Klasseninstanzmethoden nicht explizit als virtual
deklarieren, können sie in Unterklassen nicht overridden sein (nur hidden, was ein anderer - und fast immer fehlerhafter - Fall ist).
Wirksame C++ Third Edition, Punkt 36 befasst sich ausführlich damit. Betrachten
class B {
public:
virtual void vf();
void mf();
virtual void mf(int);
...
};
class D: public B {
public:
virtual void vf(); // overrides B::vf
void mf(); // hides B::mf; see Item33
...
};
D x; // x is an object of type D
B *pB = &x; // get pointer to x
D *pD = &x; // get pointer to x
pD->vf(); // calls D::mf, as expected
pB->vf(); // calls D::mf, as expected
pD->mf(); // calls D::mf, as expected
pB->mf(); // calls B::mf - surprise!
pD->mf(1); // error - D::mf() hides B::mf(int)!
pB->mf(1); // calls B::mf(int)
Also das ist nicht genau, wie final
verhält sich in Java, aber man kann nur so nah mit C++ erhalten. Eine Alternative könnte sein, Subclassing insgesamt zu verhindern. Die technisch - funktionierende, aber nicht nette - Lösung besteht darin, alle Konstruktoren zu deklarieren private
(und eine statische Factory-Methode zur Verfügung zu stellen, wenn Sie die Instanziierung Ihrer Klasse natürlich zulassen wollen).
Wenn ich nicht missverstanden habe, dann 'überschreiben' ist die Kopie der Basisklasse zu verstecken, was in diesem Fall sehr wahrscheinlich ist. Was ich möchte ist, dass die abgeleiteten Klassen immer die Kopie der Funktion der Basisklasse verwenden/aufrufen. – Hemant
@Hemant, siehe die Links und das Codebeispiel, das ich hinzugefügt habe. –
Ich kenne Java nicht, aber von dem, was ich gehört habe, dachte ich in Java, du konntest nicht einmal 'D :: mf()' deklarieren. – sbi
prüfen this von Bjarne (Kann ich aufhören Menschen aus meiner Klasse ableiten?)
Ein Link [direkt] (http://www2.research.att.com/~bs/bs_faq2.html#no-derivation) könnte nützlicher sein: p. – Stephen
@Stephen: Ich habe es eingefügt. @chubsdad: Ich hoffe, es macht dir nichts aus. – sbi
@sbi: Oh ja, Rechte bearbeiten. Ich habe diese jetzt. Ich habe vergessen. > _ <. – Stephen
Eigentlich ist es möglich, wenn Sie MSVC verwenden. Es gibt ein sealed
Schlüsselwort. Hier ist ein example from msdn.
C++ 11 fügt ein kontextuelles final
Schlüsselwort dies zu unterstützen:
class B
{
public:
virtual void foo() final;
};
class D : B
{
public:
virtual void foo(); // error: declaration of 'foo' overrides a 'final' function
};
final
in GCC 4.7 und 3.0 Clang unterstützt wird. Und wie Sergius in seiner Antwort feststellt, unterstützt MSVC++ dies seit MSVC++ 2005 (mit der Schreibweise sealed
). Wenn Sie also in einem Mini-Makro kapseln und es abhängig von Ihrem Compiler setzen, können Sie damit unterwegs sein. Nur stellen Sie sicher, dass Sie tatsächlich sind mit einem solchen Compiler mindestens so oft, so dass Sie Fehler frühzeitig erkennen.
Der neue C++ 11-Standard unterstützt jetzt explizite Überschreibungen und endgültige Elementfunktionen!
- 1. Wie definiere ich Eigenschaften für eine Klasse in PHP?
- 2. Wie definiere ich Funktionen mit Racket-Makros?
- 3. Wie definiere ich Funktionen in Python neu?
- 4. swig Perl-Wrapper generiert nicht für Klasse Member-Funktionen
- 5. Swift Final Classes und Funktionen
- 6. Wie werden private Member einer Klasse über Member-Funktionen der Klasse auf Speicherebene aufgerufen?
- 7. Wie definiere ich den Nicht-Member-Konstruktor einer abgeleiteten Klasse (innerhalb der Klassenkopfzeile)
- 8. Wie funktionieren Template-Member-Funktionen in C++?
- 9. C++ - Member-Funktionen vs Freie Funktionen
- 10. Wie kann ich eine Klasse deklarieren und ihre Member-Funktionen später in C++ verwenden?
- 11. Wie definiere ich eine Testaufgabe?
- 12. Wie definiere ich eine Tastenkombination?
- 13. Mehrdeutigkeit partielle Vorlage Spezialisierung für Member-und Member-Funktionen
- 14. Non-Member vs Member-Funktionen in Python
- 15. Passing Member-Funktionen std :: thread
- 16. Wie definiere ich eine BOOL-Konstante?
- 17. Wie definiere ich das?
- 18. Wie definiere ich eine Zusammenfassung in routeprovider?
- 19. Wie ES6 Klasse final (non-subclassible)
- 20. Wie definiere ich statisches const Mitglied?
- 21. Wie definiere ich eine Crypto-Bibliothek für xmlsec
- 22. Wie definiere ich eine Ausnahme für Zeilenumbrüche in Vim?
- 23. std :: string length() und size() Member-Funktionen
- 24. Wie definiere ich Unterklassen?
- 25. Tupel von void member Funktionen
- 26. Wie definiere ich eine zyklische Typdefinition?
- 27. Wie definiere ich eine vorzeichenlose char * Zeichenkette?
- 28. Lua Klasse Member-Funktion für jeden anderen
- 29. Wie definiere ich CSS-Klasse in einem Inline-CSS?
- 30. "final" -Klasse Implementierung in C++
Interessante Frage in einem Interview zu stellen ... da die Antwort ist, nichts zu tun. (Ich glaube.) – Stephen
Nein Spezielle Funktionen in C++ vermeiden in override, nur virtuell deklarieren und überschreiben. – ratty
Die Frage ist nicht sehr klar. Dass Sie die Frage gestellt haben, bedeutete für mich, dass Sie über virtuelle Funktionen sprachen. In diesem Fall lautet die Antwort: Nein. Eine Klasse, die von einer Klasse mit einer virtuellen Funktion in einem Vorfahren abgeleitet ist, kann die Funktion außer Kraft setzen. Wie andere darauf hingewiesen haben, sans "virtual", können alle Funktionen nicht überschrieben werden. Ich kenne Java nicht, also bin ich mir nicht sicher, was es erlaubt, wenn .... –