仮想メンバ関数の呼び出し

Example 47 に、仮想ベースまたは非仮想ベースのいずれかで仮想関数を呼び出すことができるコードを示します。

Example 47. 仮想関数の呼び出し

// rp は D* を格納する。rp->f() の等価の機能を実現する。ここで、f は
// 仮想関数
// this ポインタ以外のすべての引数は既に設定済み
// f が struct を返さないと想定する
 if __mcall_is_in_vbase(D, f)
    LDR r12, [rp]                                 // vtable ポインタをフェッチする
    LDR r0, [r12, #-__mcall_offsetof_vbase(D, f)] // base オフセットをフェッチする
    ADD r0, r0, rp                                // this 調整を行う
    LDR r12, [r0]                                 // vbase vtable ポインタをフェッチする
 else
    MOV r0, rp                                    // D* のポインタを設定する
    LDR r12, [rp]                                 // vtable ポインタをフェッチする
    ADD r0, r0, #__mcall_this_offset(D, f)        // this 調整を行う
 endif
    MOV lr, pc                                    // lr を準備する
    LDR pc, [r12, #__vcall_offsetof_vfunc(D, f)]  // rp->f() を呼び出す

Show/hide関連項目

Copyright © 2010-2011 ARM. All rights reserved.ARM DUI 0472EJ
Non-ConfidentialID081711