2010-09-02 4 views
16

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

+0

Interessante Frage in einem Interview zu stellen ... da die Antwort ist, nichts zu tun. (Ich glaube.) – Stephen

+0

Nein Spezielle Funktionen in C++ vermeiden in override, nur virtuell deklarieren und überschreiben. – ratty

+1

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

Antwort

9

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

+0

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

+0

@Hemant, siehe die Links und das Codebeispiel, das ich hinzugefügt habe. –

+0

Ich kenne Java nicht, aber von dem, was ich gehört habe, dachte ich in Java, du konntest nicht einmal 'D :: mf()' deklarieren. – sbi

3

prüfen this von Bjarne (Kann ich aufhören Menschen aus meiner Klasse ableiten?)

+0

Ein Link [direkt] (http://www2.research.att.com/~bs/bs_faq2.html#no-derivation) könnte nützlicher sein: p. – Stephen

+0

@Stephen: Ich habe es eingefügt. @chubsdad: Ich hoffe, es macht dir nichts aus. – sbi

+0

@sbi: Oh ja, Rechte bearbeiten. Ich habe diese jetzt. Ich habe vergessen. > _ <. – Stephen

1

Eigentlich ist es möglich, wenn Sie MSVC verwenden. Es gibt ein sealed Schlüsselwort. Hier ist ein example from msdn.

21

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.

1

Der neue C++ 11-Standard unterstützt jetzt explizite Überschreibungen und endgültige Elementfunktionen!

Verwandte Themen