C++对象内存布局--②测试派生类跟基类的虚函数表

时间:2022-05-12 05:26:33

C++对象内存布局--②测试派生类跟基类的虚函数表

 测试2:父类虚函数表跟子类虚函数表是不同的。 

  
  
  
// 派生类跟基类的虚函数表.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 ;
}
/*
Base::show()
虚函数表地址 = 0x0041C248
私有成员变量 = 0x0000000A
Derived::show()
虚函数表地址 = 0x0041C260
私有成员变量 = 0x0000000A
私有成员变量 = 0x00000014
请按任意键继续. . .
*/