Пусть иерархия классов:
class Base { virtual ~Base() throw(); };
class DerivedA : public Base { };
class DerivedB : public Base { };
Я хотел бы иметь некоторый код, специфичный для каждого из этих производных классов. Однако этот код также специфичен для приложения, которое использует эту иерархию классов, и я не хочу встраивать этот код, специфичный для производного класса, в эти производные классы. Чтобы избежать этого, я подумал о написании бесплатных функций:
void DerivedASpecificWork( DerivedA da );
void DerivedBSpecificWork( DerivedB db );
Однако, когда мне предоставляется экземпляр производного класса через ссылку/указатель на базу, у меня нет доступа к фактическому типу экземпляра, и поэтому я не могу вызвать правильную функцию Derived*SpecificWork().
Я хотел бы знать, нет ли какого-либо шаблона проектирования, который позволил бы мне вызывать функцию, специфичную для производного класса, не зная фактического типа экземпляра, т.е. имея тот же механизм, что и виртуальные функции, но без этих виртуальных функции, которые потребовали бы от меня внедрения кода, специфичного для приложения, в эту иерархию классов.
На самом деле, я хочу сделать это, чтобы предоставить информацию об исключении, которое произошло внутри встроенной функции, вызванной сценарием Lua. Каждое исключение несет свой собственный набор информации, то, как я хочу представить ошибку в скрипте, зависит от типа исключения. Я мог бы создать чисто виртуальный метод в базовом классе, который был бы реализован производными классами, но это потребовало бы от меня встраивания кода, связанного с Lua, в мою иерархию исключений, чего я не хочу делать, поскольку Lua специфичен для одного из приложение, использующее эту иерархию исключений.
Также я не могу использовать С++ 11.
Спасибо.