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. –
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