WR>Вот ещё одна возможная реализация мультиметодов на C++:
WR>#define DEF_ID(n)\
WR> enum ID {ID = n};\
WR> virtual int GetID()\
WR> { return ID; };
WR>// Коллекция классов:
WR>struct GObject
WR>{
WR> DEF_ID(0)
WR> virtual ~GObject(){};
WR>};
Можно для определения типа использовать такой трюк (я его придумал пару лет назад,
мы его давно включили в нашу библиотеку):
#define DEF_ID()\
virtual int GetID() const { return classtype(); } \
static int classtype() { return (int)classtype; }
// преобразование к (int) можно не делать если GetID бы возвращал "const void*",
// так в общем и надо делать - тут я просто сделал упрощение
struct GObject
{
DEF_ID();
virtual ~GObject(){};
};
Т.е. не надо каждый раз придумывать константы — в качестве уникального идентификатора класса
используется адрес статической функции, который вычисляется автоматически.
Казалось бы, что в принципе якобы linker может все функции слить в одну,
но на самом деле не может, т.к. например по Строустропу (гл.13), что адрес глобального объекта
обьявленый как "extern" может использоваться как аргумент шаблона.
Словом тут linker ничего поделать не может и для каждого класса генерирует
разные функции, и таким образом получается автоматическая идентифичация класса.
Кстати, а почему бы "typeid()" не использовать — я то его не использовал из-за того, что
RTTI все имена классов в *.exe файл лепит, а это не очень хорошо