加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

父类虚函数表跟子类虚函数表地址是不同的

(2011-06-20 21:31:32)
标签:

杂谈

//派生类跟基类的虚函数表.cpp
//2010年8月18日
//测试说明,父类虚函数表跟子类虚函数表是不同的。理解C++对象的内存布局
//VS编译器
#include <iostream>
using namespace std;
//////////////////////////////////////////////////////////////////
class Base
{
public:
Base():b(
10)
{
}
virtual void show()
{
cout
<< "Base::show()" << endl;
}
private:
int b;
};
//////////////////////////////////////////////////////////////////
class Derived : public Base
{
public:
Derived():c(
20)
{
}
void show()
{
cout
<< "Derived::show()" << endl;
}
private:
int c;
};
//////////////////////////////////////////////////////////////////
int main()
{
Base a_obj;
int** p = (int**)&a_obj;
typedef
void (__thiscall *fun)(void*pThis);//非常重要//虚函数表指针->虚函数表->调用虚函数
((fun)(p[0][0]))(p);
cout
<< "虚函数表地址 = 0x" << p[0] << endl;
cout
<< "私有成员变量 = 0x" << p[1] << endl;

Derived b_obj;
int** pp = (int**)&b_obj;
((fun)(pp[
0][0]))(pp);//虚函数表指针->虚函数表->调用虚函数
cout << "虚函数表地址 = 0x" << pp[0] << endl;
cout
<< "私有成员变量 = 0x" << pp[1] << endl;
cout
<< "私有成员变量 = 0x" << pp[2] << endl;
system(
"pause");
return 0;
}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有