Betrachten Sie eine bestehende C++-Klassenhierarchie: eine Wurzelklasse, viele Unterklassen, die einen direkten azyklischen Graphen bilden.
Ich möchte der Root-Klasse eine Methode hinzufügen und sie möglicherweise in einigen untergeordneten Klassen außer Kraft setzen. Aber das Problem ist, dass es mir verboten ist, diese bestehenden Klassen zu ändern (Bibliothek eines Drittanbieters, Projektpolitik, geschlossene Quellen, usw.).
Eine Mixin/Erweiterungsklasse wäre dann eine gute Lösung. Aber das ist in C++ nicht trivial machbar.
Die schnelle und schmutzige Lösung besteht darin, eine Funktion zu schreiben, die auf den Typ des Objekts mit die dynamisch_gecastet Operator und die Ausführung des gewünschten Codes für jeden Typ der Hierarchie. Dies ist jedoch eine schlechte Praxis, da es fehleranfällig ist, die Kapselung bricht und zukünftige Änderungen nicht sicher unterstützt.
Ich denke darüber nach, irgendwo eine Art Hash-Tabelle mit der Definition zu führen {rtti type id, aufzurufende Funktion} ", und verwenden Sie dies als a gefälschte VT-Tabelle für die Funktion, die ich schreiben und außer Kraft setzen möchte. Aber ich bin nicht sicher, ob es besser wäre...
Haben Sie eine andere Idee? Laufzeit-VTable-Änderung? Lösung für die Meta-Programmierung von Vorlagen? Andere?
Vergessen Sie nicht: Ich kann die ursprünglichen Klassen definitiv nicht ändern (weder Header noch Implementierung).