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 | |