虛擬函式表以及單繼承多繼承物件模型
阿新 • • 發佈:2019-01-06
#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;
}
#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;
}