骚操作-通过对象地址取虚函数

有助于理解动态多态底层原理(大概)

阅读以下代码

class Base
{
public:
    virtual void test()
    {
        cout<<"Hello World1"<<endl;
    }
};

class Derived:public Base
{
public:
    virtual void test()
    {
        cout<<"Hello World2"<<endl;
    }
};

// 传入对象指针,返回对象虚函数表中的 test 函数指针
void* get_function_pointer(void* p)
{
    // 当前 p指向对象
    p = static_cast<void*>(*(static_cast<void**>(p)));
    // 当前 p指向类域的虚函数表
    p = static_cast<void*>(*(static_cast<void**>(p)));
    // 当前 p指向虚函数表中的 test 函数
    return p;
}

int main(void){
    Base* D = new Derived();
    Base* B = new Base();
    void (*functionB)() = (void (*)())(get_function_pointer(static_cast<void*>(B)));
    functionB(); // 输出 Hello World1
    void (*functionD)() = (void (*)())(get_function_pointer(static_cast<void*>(D)));
    functionD(); // 输出 Hello World2
}

要点

疑点