Ich sehe immer viele Beispiele, in denen virtuelle Funktionen in Header-Dateien als geschützt deklariert werden. Ist es falsch, virtuelle Funktionen als öffentlich zu deklarieren? Was ist die beste Vorgehensweise bei der Verwendung virtueller Funktionen?Verwenden von geschützten oder öffentlichen mit virtueller Funktion?
Antwort
Ist es falsch, virtuelle Funktionen als öffentlich zu deklarieren?
Nr
Was ist die beste Praxis, wenn virtuelle Funktionen?
Das hängt vollständig von Ihren Anwendungsfällen ab. Die Schlüsselwörter per se sind orthogonal in Verwendung.
Manchmal ist es gut protected
virtual
Funktionen zu haben wie mit dem template design pattern, die meiste Zeit die virtual
Funktionen public
deklariert eine Schnittstelle zur Verfügung zu stellen.
Es gibt zwei Design-Muster Kategorien der public
und protected
Erbe fallen in:
Template Funktion Muster:
class Base { public: void foo() { bar(); }; protected: virtual void bar() = 0; }; class Implementation : public Base { void bar() { // provide the implementation } };
Schnittstelle Muster:
struct Interface { virtual void foo() = 0; virtual ~Interface() {} }; class Implementation : public Interface { public: void foo() { // provide the implementation } };
Es gibt andere Entwurfsmuster, die virtual
überhaupt weglassen können (siehe CTRP), aber die Semantik von public
und protected
ist noch gehalten.
Manchmal sind sie nicht direkt zugänglich, um das NVI-Idiom zu unterstützen. –
- 1. VB.NET: Eigenschaft mit öffentlichen Getter und geschützten Setter
- 2. C++ wie öffentlichen und geschützten Accessoren gleichen Mitglied
- 3. Virtueller Funktionsaufruf von einer normalen Funktion
- 4. privaten oder öffentlichen MSMQ
- 5. Methoden mit privaten Mitgliedern oder öffentlichen Accessoren
- 6. Aufruf der öffentlichen PHP-Funktion von JavaScript
- 7. Sicherung der Eingabe von privaten/geschützten Methoden?
- 8. Virtueller Host mit mehreren Zend-Modulen
- 9. Virtueller Mac?
- 10. Verwenden von XmlSerializer mit privaten und öffentlichen const-Eigenschaften
- 11. Hinzufügen zu virtueller Funktion in abgeleiteten Klasse
- 12. `Return` Methode funktioniert nicht in geschützten Funktion
- 13. Filter auf einem geschützten Blatt verwenden
- 14. Verwenden von Concept-Insights öffentlichen Korpora Berechtigungen
- 15. Verwenden von Nullable Types in öffentlichen APIs
- 16. Wie verwendet man eine C++ Klasse mit reiner virtueller Funktion?
- 17. Brace Initialisierung für die Klasse mit virtueller Funktion
- 18. Verwenden des öffentlichen Schlüssels von authorized_keys mit Java-Sicherheit
- 19. Verwenden von Moq zum Überschreiben virtueller Methoden in derselben Klasse
- 20. Virtueller Speicher
- 21. Einige Fragen zur abstrakten Klasse mit privaten, öffentlichen und geschützten Konstruktoren
- 22. Virtueller Joystick in Java
- 23. PHP-Vererbung und Sichtbarkeit von geschützten Elementen
- 24. PostgreSQL funktioniert nicht mit virtueller envirement
- 25. Funktioniert Boost.Serialization einfach mit virtueller Diamantvererbung?
- 26. Virtueller Zeiger
- 27. Eclipse mit Flex-Plugin: IntelliSense zeigt keine geschützten Methoden
- 28. Wie kann ich private Variablen aus einer Klasse in Form1 mit einer öffentlichen Funktion übergeben/verwenden?
- 29. cc1plus: Virtueller Speicher erschöpft
- 30. Verwenden von Mercurial zum Trennen der privaten und öffentlichen Version
Wenn Sie möchten, dass es von irgendjemand aufgerufen wird, dann 'public'. Wenn Sie möchten, dass es von einer abgeleiteten Klasse aufgerufen wird, dann "protected". Wenn Sie möchten, dass es nur von der Klasse selbst aufgerufen wird, dann 'private'. ** Hinweis **: Eine private virtuelle Funktion kann von der Basisklasse gesendet werden. –
[This] (http://www.gotw.ca/publications/mill18.htm) könnte eine interessante Lektüre für Sie sein. –
Es könnte das [Non-Virtual Interface (NVI) -Idiom] sein (https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Non-Virtual_Interface). – emlai