当类中含有虚函数时,代码如下:
#include<iostream>
class Base
{
public:
Base(int i) :baseI(i) {};
virtual void print(void) { std::cout << "Base::print()" << std::endl; }
virtual void setI() { std::cout << "Base::setI()" << std::endl; }
virtual ~Base() {}
private:
int baseI;
};
int main()
{
Base b(5555555);
int * vfptr = (int *)(&b);
std::cout << "虚函数表指针(vfptr)的地址是:" << vfptr << std::endl;
typedef void(*Fun)(void);
Fun vfunc = (Fun)*((int *)*(int*)(&b));
std::cout << "第一个虚函数的地址是:" << (int *)*(int*)(&b) << std::endl;
std::cout << "通过地址,调用虚函数Base::print():" << std::endl;
vfunc();
vfunc = (Fun)*((int *)*(int*)(&b) + 1);
std::cout << "第二个虚函数的地址是:" << (int *)*(int*)(&b) + 1 << std::endl;
std::cout << "通过地址,调用虚函数Base::setI():" << std::endl;
vfunc();
std::cout << "通过地址,访问私有成员baseI:" << *(((int *)(&b)) + 1) << std::endl;
return 0;
}
验证结果如下:

内存布局如下:


参考文章
转载自CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/qq_34762931/article/details/160286080



