v-table index
Hi, everyone
I can operate with pointer-to-member functions.
How can I get virtual member function index from v-table?
I would like to iterate v-table and to execute virtual method by v-
table index.
Is it possible?
CODE:
----------------------------------------------------------------------------------------
class ICollection
{
public:
virtual void SystemMethod_0() = 0;
virtual void SystemMethod_1() = 0;
virtual void SystemMethod_2() = 0;
virtual void SystemMethod_3() = 0;
/* pointer-to-member */
typedef void (ICollection::*fnMethod)();
/* get pointer-to-member by id */
virtual ICollection::fnMethod getMethodPtr(size_t nIndex) = 0;
/* ctor and virtual dtor */
ICollection() {}
virtual ~ICollection() {}
};
class CTest: public ICollection
{
public:
virtual void SystemMethod_0() {printf("SystemMethod_0");}
virtual void SystemMethod_1() {printf("SystemMethod_1");}
virtual void SystemMethod_2() {printf("SystemMethod_2");}
virtual void SystemMethod_3() {printf("SystemMethod_3");}
virtual ICollection::fnMethod getMethodPtr(size_t nIndex)
{
ICollection::fnMethod fnAction = NULL;
switch(nIndex)
{
case 0: fnAction =
(ICollection::fnMethod)&CTest::SystemMethod_0;break;
case 1: fnAction =
(ICollection::fnMethod)&CTest::SystemMethod_1;break;
case 2: fnAction =
(ICollection::fnMethod)&CTest::SystemMethod_2;break;
case 3: fnAction =
(ICollection::fnMethod)&CTest::SystemMethod_3;break;
default: assert(false);break;
}
return fnAction;
}
/* ctor and dtor */
CTest() {}
~CTest() {}
};
/* usage */
int main(int argc, const char* argv[])
{
ICollection* pCollection = new CTest();
ICollection::fnMethod fnAction = NULL;
for (size_t nIndex=0; nIndex!=4; ++nIndex)
{
/* I would like to get v-table index and execute method by v-table
index */
/* But I can operate only with pointer-to-memeber like
this */
fnAction = pCollection->getMethodPtr(nIndex);
(pCollection->*fnAction)();
}
delete pCollection;
return 0;
}
----------------------------------------------------------------------------------------
Thank you for helping me!