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;
}

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

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...