Oli Charlesworth が指摘したように、仮想ポインタは実装の詳細であるため、この質問は C++ に関してはあまり意味がありません。そうは言っても、次の仮想関数 (機能の一部) の手動実装は、理解に役立つ場合があります。
struct vtable {
void (*display)(void*);
void (*setValue)(void*, int);
};
void A_display(void *this_) { /*Cast this_ to A* and do A stuff*/ }
void A_setValue(void *this_, int x) { /*Cast this_ to A* and do A stuff*/ }
vtable A_vtable = {A_display, A_setValue};
struct A {
vtable *vptr = &A_vtable;
int a;
public: A(){}
};
void B_display(void *this_) { /*Cast this_ to B* and do B stuff*/ }
void B_setValue(void *this_, int x) { /*Cast this_ to B* and do B stuff*/ }
vtable B_vtable = {B_display, B_setValue};
struct B {
vtable *vptr = &B_vtable;
int a;
public: B(){}
};
void display(void *obj) {
((*static_cast<vtable**>(obj))->display)(obj);
}
void setValue(void *obj, int) {
((*static_cast<vtable**>(obj))->setValue)(obj, int);
}
もちろん、これは仮想関数の機能のごく一部しか示していませんがvptrs
、固定型の関数へのポインターのコレクションを指していることを理解するのはかなり簡単です。