1. 程式人生 > >虛擬函式表以及單繼承多繼承物件模型

虛擬函式表以及單繼承多繼承物件模型

#include<iostream>
#include<Windows.h>
using namespace std;


class Base1
{
public:
virtual void func1()
{
cout << "Base1::func1" << endl;
}


virtual void func2()
{
cout << "Base1::func2" << endl;
}


private:
int b1;
};


class Base2
{
public:
virtual void func1()
{
cout << "Base2::func1" << endl;
}


virtual void func2()
{
cout << "Base2::func2" << endl;
}


private:
int b2;
};


class Derive :public Base1, public Base2
{
public:
virtual void func1()
{
cout << "Derive::func1" << endl;
}


virtual void func2()
{
cout << "Derive::func3" << endl;
}


private:
int d1;
};


typedef void(*FUNC)(void);
void PrintVTable(int *VTable)
{
cout << "虛表地址" << VTable << endl;




for (int i = 0; VTable[i] != 0; ++i)
{
printf("第%d個虛擬函式地址:OX%x,->", i, VTable[i]);




FUNC f = (FUNC)VTable[i];
f();
}
cout << endl;
}


void Test1()
{
Derive d1;
//Base虛擬函式表在物件Base1後面
int* VTable = (int*)(*(int*)&d1);
PrintVTable(VTable);
int*VTable2 = (int*)(*((int*)&d1 + sizeof(Base1) / 4));
PrintVTable(VTable2);
}


int main()
{
Test1();
system("pause");
return 0;
}