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我不会问为什么你这样做,但在这里你有一个选择:-)