仮想関数ポインタは4バイトとは限らない
呼べました。なんてあっさりと。。。
スタック上の値が0だったりCCだったりしたのはポインタのサイズが違ってて4バイト以上の余り部分が初期化されていないからなんでしょうね。
これをsquirrelに組み込んでみます。いままでuserpointerの自由変数でやってたからそこも変えないと。int×2とかにしてみますか。
#include <stdio.h> #include <string.h> //基底クラス class aaa { }; //squirrelへ登録するクラス class bbb : public /*virtual*/ aaa { public: bbb() { strcpy(msg,"yes!!\n"); } virtual void echo() { printf("this=0x%08X\n",(uintptr_t)this); printf(msg); } private: char msg[256]; }; //関数ポインタ型 typedef void (bbb::*fff)(); //関数ポインタデータ struct nnn { int n[sizeof(fff)/sizeof(int)]; }; //実際に関数呼び出し template<typename T> void call( T* p, nnn x ) { union{ nnn n; fff f; }; n = x; (p->*f)(); } //main void main() { printf("S=%d\n",sizeof(fff)); bbb b; printf("&b=0x%08X\n",(uintptr_t)&b); union { fff f; nnn n; }; f = &bbb::echo; call(&b,n); }
ちなみに仮想継承にするとsizeof(fff)=12になりました。