読者です 読者をやめる 読者になる 読者になる

squirrelへのクラス登録、仮想関数テーブルがあるとNG

ベクトル組み込みはできた。コンストラクタによくあるオーバーライドに関してはメソッド名を変えることでスルー。
他のクラスを登録しようとしたら、キャストにミスってるらしくvfptrがあるとうまくメソッドが呼ばれない。あとちょっと。。。

2008.09.16 追記

仮想関数テーブル(vfptr)を持つクラスを登録する場合、基底クラスにも仮想関数が存在していないとthisがおかしくなるみたい。ハングするコードをこう(コンパイラはvs8)

//基底クラス
class aaa {
};
//squirrelへ登録するクラス
class bbb : public 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)();
//実際に関数呼び出し
template<typename T>
void call( T* p, void* f )
{
  fff x = *(fff*)&f;
  (p->*x)();
}
//main
void main()
{
  bbb b;
  printf("&b=0x%08X\n",(uintptr_t)&b);
  union {
    fff x;
    void* f;
  };
  x = &bbb::echo;
  call(&b,f);
}

bbb::echoをvirtualにするとハングする。
逆アセしてみると、pにオフセットを足しているので多重継承のための処理が紛れ込んでる?そのオフセットがスタック上で初期化されずに0xCCCCCCCCになってて変なポインタになる。正常に処理される場合はそのオフセットが0になってる。
たぶんこの書き方はダメなんでしょうねぇ。教えてえらい人。