2016-05-28 19 views
2

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?

+1

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

+1

[This] (http://www.gotw.ca/publications/mill18.htm) könnte eine interessante Lektüre für Sie sein. –

+0

Es könnte das [Non-Virtual Interface (NVI) -Idiom] sein (https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Non-Virtual_Interface). – emlai

Antwort

3

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 protectedvirtual 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:

  1. Template Funktion Muster:

    class Base { 
    public: 
        void foo() { 
         bar(); 
        }; 
    protected: 
        virtual void bar() = 0; 
    }; 
    
    class Implementation : public Base { 
        void bar() { 
         // provide the implementation 
        } 
    }; 
    
  2. 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.

+0

Manchmal sind sie nicht direkt zugänglich, um das NVI-Idiom zu unterstützen. –