nicht sicher, wie es auch zu erklären, so dass ich nur eine Stichprobe von Code, der mein Problem zeigt:Aufruf angegebene Methode aus der Basisklasse
class Base {
public:
Base() = default;
~Base() = default;
virtual void stuff(std::shared_ptr<Base> b) = 0;
};
class DerivedA : public Base {
public:
DerivedA() = default;
~DerivedA() = default;
void stuff(std::shared_ptr<Base> b) {
std::cout << "stuff Base"
<< "\n";
}
};
class DerivedB : public Base {
public:
DerivedB() = default;
~DerivedB() = default;
void stuff(std::shared_ptr<Base> b) {
std::cout << "stuff Base"
<< "\n";
}
void stuff(std::shared_ptr<DerivedA> b) {
std::cout << "stuff Derived"
<< "\n";
}
};
int main(int argc, char *argv[]) {
std::shared_ptr<Base> b1(new DerivedA());
std::shared_ptr<Base> b2(new DerivedB());
b1->stuff(b2);
b2->stuff(b1);
return 0;
}
Der Ausgang wird sein:
stuff Base
stuff Base
Nun, ich nehme an, dass es nicht möglich ist, die abgeleitete Methode aufzurufen, da sie in der Basisklasse nicht existiert.
Meine Frage ist: Gibt es eine Möglichkeit, stuff(std::shared_ptr<DerivedA> b)
mit der Basisklasse aufzurufen?
[EDIT]
Ich dachte schon über das Besuchermuster (es soll gesagt haben, und genauer sein).
Meine Klassen repräsentieren Entitäten und ich muss Kollisionen zwischen ihnen überprüfen. Jedoch wird eine Kollision zwischen A & B eine andere Wirkung haben als zwischen
Ich stimme zu, dass es funktioniert, aber es bedeutet, dass ich Tonnen von Methoden definieren muss.
Gibt es einen eleganteren Weg, es zu tun?
Vielen Dank im Voraus.
Das sieht nach einem Job für das Besuchermuster aus! https://en.wikipedia.org/wiki/Visitor_pattern – Louen
Sieht so aus, als ob Sie zwischen dem Überladen der Methode (oder einer Funktion) und dem Überschreiben der (virtuellen) Methode verwechselt werden. – hyde
Ich habe meine Frage bearbeitet, um @Louen zu beantworten – Luc