Небольшие эксперименты показали - а почему бы и нет :-)
#include <iostream>
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
class Base {
public:
virtual ~Base(){}
private:
virtual void ShowBase() {
std::cout << "BaseShow" << std::endl;
}
};
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
class Derived: public Base {
public:
virtual void ShowDerived() {
std::cout << "DerivedShow" << std::endl;
}
};
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
#ifdef _MSC_VER
#define IDX 1
#else
#define IDX 2
#endif
int main() {
Derived *D = new Derived();
(*(void(*)(void*))((void**)(*(void**)D))[IDX])(D);
delete D;
return 0;
}
При использовании M$ VC++ VMT строится по-иному.