Frage

Ich habe dieses Problem mehr als einmal gefangen:

class A{
public:
  virtual ~A() {}
  virtual int longDescriptiveName(){ return 0; }
};

class B: public A{
public:
  virtual int longDescriptveName(){ return 1; } // Oops
};

Wenn die Funktion virtuelle rein ist, fängt der Compiler den Fehler. Aber wenn es nicht kann dies ein schrecklicher Fehler sein, ausfindig zu machen. Ein Teil des Problems besteht darin, dass Funktionsnamen vielleicht zu lang sind. Aber ich immer noch Wunder, ist es eine Möglichkeit, früher diese Fehler zu sehen?

War es hilfreich?

Lösung

Eine Möglichkeit ist, die wenig befahrene rein virtuelle Funktion bei der Implementierung:

virtual int longDescriptiveName() = 0
{
    return 0; 
}

Dies zwingt Klassen abzuleiten es außer Kraft zu setzen. Sie können dann rufen Sie die Basisklassen-Implementierung allein, wenn sie nur das Verhalten wollen.

Darüber hinaus müssen Sie sicherstellen, dass Ihre Vererbungshierarchie machen ist flach, anstatt mit mehreren Schichten, die in der Regel trotzdem gut ist, weil Vererbung zerbrechlich genug ist, auf den Schichten ohne anhäufen.

Andere Tipps

Wenn Sie mit Microsoft Visual C ++ 2005 oder neuer kompilieren, gibt es eine Nicht-Standard-Erweiterung Sie schreiben erlaubt:

virtual int longDescriptveName() override { return 1; }

Und wird der Compiler beschweren. Wenn Sie auch mit anderen Compilern, smart seine wahrscheinlich eine #define zu machen, damit Sie das Verhalten steuern.

Alte necro'd Frage, aber ein guter Weg ist, früh zu testen, entweder formal mit Unit-Tests, oder informell, bevor Sie die Klassen starten. Mit anderen Worten, überprüft früh, dass:

A test_a;
B test_b;
A& poly_a = test_a;
A& poly_b = test_b;
assert(poly_a.longDescriptiveName() == 0);
assert(poly_b.longDescriptiveName() == 1);

vor Sie schreiben 10.000 mehr Codezeilen, die Ihre Klassen verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top