Жутко накрученный пример в 1-ом посте. Вот попроще набросал:
#include <iostream>
using namespace std;
class Object{
private:
static unsigned short counter;
unsigned short ID;
public:
Object();
void Show(char s)const;
};
unsigned short Object::counter=0;
Object::Object(){
this->counter++;
this->ID=counter;
}
void Object::Show(char s)const{
cout<<'['<<this->ID<<"]: "<<s<<endl;
}
int main()
{
void (Object::*FuncPtr)(char s)const = &Object::Show;
Object x1;
Object x2;
(x1.*FuncPtr)('a');
(x2.*FuncPtr)('b');
x1.Show('a');
x2.Show('b');
return 0;
}
Пример (среди прочего) доступно демонстрирует момент архитектуры. Функции для всех объектов класса создаются в единственном экземпляре единожды. Уточнение, для какого объекта функция вызывается (если функция не статическая) необходимо только непосредственно в момент вызова (чтобы определить к какой копии набора компонентов класса обращаться).
Сравни то же на Б3Д
Type TObject
Field ID%
End Type
Global TObject__counter%=0
Function TObject__TObject.TObject()
Local TObj.TObject=New TObject
TObject__counter=TObject__counter+1
TObj\ID=TObject__counter
Return TObj
End Function
Function TObject__Show(TObj.TObject,s$)
Print "["+Str(TObj\ID)+"]: "+s
End Function
x1.TObject=TObject__TObject()
x2.TObject=TObject__TObject()
TObject__Show(x1,"a")
TObject__Show(x2,"b")
WaitKey()
End
Синтаксис C++ позволяет реализовать вызов
TObject__Show(x1,"a") как
x1.TObject__Show("a"). При этом функция
TObject__Show по-прежнему размещается в памяти единожды.