Nun, niemand ist wirklich direkt beantwortet Ihre Frage (na ja, Heavyd versucht), also werde ich. Einige andere "Antworten" sind hier hilfreicher, um Ihr Problem zu beheben.
Das Problem ist, dass void DoIt (B *) ist keine Überschreibung der virtuellen Funktion DoIt (A *). Es ist eine Überladung. Es ist ein großer Unterschied.
Wenn Sie sagen, dass DoIt (B *) nicht aufgerufen wird, wenn Sie ein B * übergeben, muss ich annehmen, dass Sie Verweise oder Zeiger auf Q durch einen Zeiger auf etwas höher in der Hierarchie halten. In diesen Fällen findet die statische Namensauflösung nur DoIt (A *) und da B * ein A * ist, wird es upcasted und das ist die Version, die aufgerufen wird. Da es virtuell ist, wird die Überschreibung in Q aufgerufen.
Wenn Sie einen Zeiger auf Q als Zeiger auf Q hatten und DoIt mit B * aufgerufen wurde, sollte die DoIt (B *) - Funktion aufgerufen werden. An diesem Punkt ist keine doppelte Übermittlung erforderlich und wird nicht verwendet.
Sie benötigen doppelten Versand, wenn Sie zwei abstrakte Typen und eine Funktion haben, die sich basierend auf den konkreten Typen der beiden Abstraktionen unterschiedlich verhalten müssen. Dies versuchen Sie, wenn Sie DoIt mit B auf Q auf einer höheren Ebene als die statische Benennung aufrufen. Es gibt zu viele Methoden, die unterschiedliche Anforderungen erfüllen, um in Ihrem Fall eine Lösung gegenüber einer anderen vorschlagen zu können. Sie wissen nicht wirklich, was Sie zu lösen versuchen. Tatsächlich brauchen Sie es vielleicht nicht einmal! Ein besserer Ansatz für Sie könnte darin bestehen, DoIt (B *) als virtuelle Funktion an der Spitze Ihrer Hierarchie zu implementieren.
Ich würde vorschlagen, dass Sie Andre Alexandrescus Buch, Modern C++ Design, und schauen Sie es sich an. Er erklärt eine ziemlich coole Besucherimplementierung sowie einen skalierbaren Mehrfachversandmechanismus. Hör nicht damit auf, es gibt andere großartige Implementierungen, die die Frage anders beantworten können.
Viel Glück.
Wie können beide DoIt-Methoden in Q existieren, ohne als mehrdeutig zurückgewiesen zu werden? –
@David - weil sie nicht sind. –
Auch sind die STL-Container nicht wirklich gebaut, um geerbt zu werden (wie P, oben). Verwenden Sie stattdessen die Komposition. – Joe