class C {
int a, b;
virtual void setA(int _a) { a = _a; }
virtual void setB(int _b) { b = _b; }
};
sizeof (C) は { TypeInfo *info; int a, b; } から計算して12バイトになる。
TypeInfoにはsetAやsetBのポインタが格納されている。
この仕組みのおかげでこんなことができます。
class C を継承して class D を作り、setBだけオーバーロードした場合、そのTypeInfoは
setBのポインタが新しい関数を指しているので、正しく子クラスの関数ポインタを得ることができ、
うまく呼び出せます。C++方式: void func(C *c) { c->setA(13); }
提案手法: void func(C *c, Func *setA) { (*setA)(c, 13); } // イメージ.| コメント | お名前 | NameLink | |