c – 从V-table调用虚函数

前端之家收集整理的这篇文章主要介绍了c – 从V-table调用虚函数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
因为C中的所有虚函数都存储在V表中.在虚函数的情况下发生重叠.
我想问一下,我们可以通过哪种方式直接从表中调用函数,并且能够确定V-table包含哪些函数.

解决方法

嗯,实际上你可以.我不关心可移植性,但在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;
}

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

原文链接:https://www.f2er.com/c/120240.html

猜你在找的C&C++相关文章