2016-07-09 5 views
0

Zum Beispiel habe ich eine abstrakte Basisklasse A und B. A hat eine virtuelle Methode als A1Zwei gefaltete Polymorphie ist seltsam, wie man es erweiterbar macht?

class A 
{ 
public: 
    virutal void f(B& b) = 0; 
}; 

Für Klasse

class A1 : public A 
{ 
public: 
    void f(B& b) override { b.f(A1); } 
}; 

und damit für B folgt, braucht es eine virtuelle Methode f(A1)

class B 
{ 
public: 
    virtual void f(A1& a) = 0; 
}; 

Und in class B1 : public B, die virtuelle Methode ist implementiert. Das Problem ist, dass, wenn ein anderes hinzugefügt wird, ich eine virtuelle Methode hinzufügen muss in Klasse B, die ich denke, dass es den Code bricht, weil ich nicht weiß, ob A2 sogar A1 hinzugefügt wird oder nicht, wenn ich Klasse B entwerfen. Wie kann man es vermeiden, aber die entsprechenden Anforderungen umsetzen? Jede C++ - Funktion kann sogar mit Vorlagen verwendet werden.

+0

Was möchten Sie wirklich erreichen? –

Antwort

1

Leider gibt es in C++ keine virtuelle Vorlagenfunktion (das ist, was ich glaube, nach der Analyse Ihrer Frage zu erreichen).

Die nächste, und die am wenigsten hässliche Lösung, die ich denken kann, ist die virtuelle Funktion in der Basisklasse haben B die Basisklasse nehmen A als Parameter:

class B 
{ 
public: 
    virtual void f(A& a) = 0; 
}; 

B1 überschreibt das, und dann Verwendungen dynamic_cast, um seinen Parameter auf eine Instanz von A1 zu übertragen.

Auf diese Weise können Sie jedes definierte Paar von abgeleiteten Klassen Ax und Bx fortsetzen, ohne die API-Schnittstelle in der Basisklasse zwischen den beiden Hierarchien ändern zu müssen.

Ein bisschen hässlich, aber die Frage besagt, "jede C++ - Funktion kann verwendet werden", und dynamic_cast qualifiziert sich sicherlich unter dieser Voraussetzung.