#include <iostream>
using namespace std;
class a
{
private:
int aa;
public:
void set(int bb){aa=bb;}
int get(){return aa;}
a(int cc){aa=cc;}
virtual void display(){cout<<"a";}
};
class b:public a
{
public:
b(int ac):a(ac){}
//void display(){cout<<get();}
virtual void display(){cout<<"b";}
};
void main()
{
b *B=new b(2);
B->set(1);
B->display();
}
main()函数中
0041154D push 8
0041154F call operator new (41120Dh)
00411554 add esp,4
00411557 mov dword ptr [ebp-0E0h],eax //上面8字节的空间地址保存在
.....
0041156F mov ecx,dword ptr [ebp-0E0h]
00411575 call b::b (411019h)
然后程序进入b类的构造函数 b(int ac):a(ac){}
0041168F pop ecx
00411690 mov dword ptr [ebp-8],ecx
00411693 mov eax,dword ptr [ac]
00411696 push eax
00411697 mov ecx,dword ptr [this]
0041169A call a::a (41113Bh)
004116FF pop ecx
00411700 mov dword ptr [ebp-8],ecx
00411703 mov eax,dword ptr [this]
00411706 mov dword ptr [eax],offset a::`vftable' (41770Ch)
0041170C mov eax,dword ptr [ebp-8]
0041170F mov ecx,dword ptr [ebp+8]
00411712 mov dword ptr [eax+4],ecx
------------------------------------------------------
成员变量
---------------------------------------------------
004115B2 mov eax,dword ptr [ebp-14h] //获得对象地址
004115B5 mov edx,dword ptr [eax]
004115B7 mov esi,esp
004115B9 mov ecx,dword ptr [ebp-14h]
004115BC mov eax,dword ptr [edx]
004115BE call eax
总结:C++中虚函数需要虚函数表支持,每个类中的虚函数都会各自保留一份执行程序。如果类中有虚函数或者继承的基类中有虚函数,就必须在所产生的对象中保存虚函数表地址,占据对象的第一个4字节空间。