从V-table调用虚函数

Kus*_*wal 7 c++ virtual-functions vtable

因为C++中的所有虚函数都存储在V-table中.在虚函数的情况下发生重叠. 我想问一下,我们可以通过哪种方式直接从表中调用虚函数,并且能够确定V-table包含哪些函数.

use*_*961 18

嗯,实际上你可以.我不关心可移植性,但在VS中你可以做到.假设我们使用VS构建32位代码,对象地址的前4个字节是vtable地址.通过查看头文件,我们知道vtable中方法的顺序.

例:

class Base
{
public:

    virtual void printMessage()
    {
        std::cout << "Base::printMessage()" << std::endl;
    }
};

class Derived : public Base
{
public:

    void printMessage()
    {
        std::cout << "Derived::printMessage()" << std::endl;
    }
};

int main(int argc, char* argv[])
{
    Derived d;

    unsigned int vtblAddress = *(unsigned int*)&d;

    typedef void(*pFun)(void*);

    pFun printFun = (pFun)(*(unsigned int*)(vtblAddress));

    printFun(&d);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

PS我不会问为什么你这样做,但在这里你有一个选择:-)

  • 令人难以置信的是,Peter Wood,Eelke,toro2k,Stony和quetzalcoatl都无法分辨出这里的问题.为什么这个帖子中的每个参与者都知道被问到的是什么?与Mike Seymour和ForEveR相比,名声相当低的5名"聪明人"正在扼杀其他所有人.我的意思是,你不明白这个问题,那很好,但让其他人为了上帝的缘故讨论它... (8认同)