2008-12-07 13 views
6

Hier ist der Deal. Ich habe eine große Klassenhierarchie und ich habe diese eine Methode, die den ganzen Weg verlängert wird. Die Methode muss immer auf jeder neuen Ebene nach einer oder zwei Variablen suchen, und diese Variablen hängen von der tatsächlichen Klasse in der Hierarchie ab. Was ich tun möchte, ist, diese zwei zusätzlichen Variablen zu überprüfen und dann die Version der Superklasse derselben Funktion aufzurufen. Ich möchte in der Lage sein, diese Funktion zu definieren, da alle ihre unmittelbaren Kinder es verwenden werden, aber ich möchte zwingen, dass alle Kinder dieser Klasse diese Methode neu definieren müssen (weil sie ihre neuen Datenmitglieder anzeigen müssen)In C++ ist es möglich, eine definierte rein virtuelle Funktion zu haben?

Also, wie würde ich das schreiben? Ich verwende normalerweise = 0; in der .h-Datei, aber ich nehme an, dass ich das nicht benutzen und definieren kann ...

Antwort

9

Eigentlich kann man eine Funktion als rein virtuell deklarieren und trotzdem eine Implementierung dafür in der Basisklasse definieren.

class Abstract { 
public: 
    virtual void pure_virtual(int x) = 0; 
}; 

void Abstract::pure_virtual(int x) { 
    // do something 
} 


class Child : public Abstract { 
    virtual void pure_virtual(int x); 
}; 

void Child::pure_virtual(int x) { 
    // do something with x 
    Abstract::pure_virtual(); 
} 
+0

Vielleicht ist mein Gehirn zu klein, aber das Ändern der Signatur von pure_virtual in der abgeleiteten Klasse hat mich verwirrt. Was illustriert es? –

+0

Onyone guten Fang oO ich habe es nicht entdeckt. Ich vermute, es ist ein Tippfehler? –

+0

Bei der ursprünglichen Frage wurden zusätzliche Daten an die in den untergeordneten Klassen definierte Funktion übergeben. Jetzt, wo du es erwähnst, denke ich, dass es auch in der Basisklasse sein sollte. –

9

Sie können eine Definition für eine reine virtuelle Funktion angeben. Überprüfen Sie GotW #31 für weitere Informationen.

+0

+1 für diesen Link - sehr interessant. –