class BaseA
{
public:
BaseA()
{
cout << __FUNCTION__ << endl;
}
virtual ~BaseA()
{
cout << __FUNCTION__ << endl;
TestA(); // 调用 Base::TestA();调用作用域内的函数
}
virtual void TestA()
{
cout << __FUNCTION__ << endl;
}
int varA;
};
class ClassB :public BaseA
{
public:
ClassB()
{
cout << __FUNCTION__ << endl;
}
virtual void TestA()
{
cout << __FUNCTION__ << endl;
}
virtual ~ClassB()
{
cout << __FUNCTION__ << endl;
TestA(); // 调用ClassB::TestA(),调用作用域内的函数
}
virtual void TestB()
{
cout << __FUNCTION__ << endl;
}
int varB;
};
class ClassC :public ClassB
{
public:
ClassC()
{
cout << __FUNCTION__ << endl;
}
~ClassC()
{
cout << __FUNCTION__ << endl;
TestA(); // 调用ClassB::TestA(),调用作用域内的函数
}
virtual void TestA()
{
cout << __FUNCTION__ << endl;
}
virtual void TestB()
{
cout << __FUNCTION__ << endl;
}
virtual void TestC()
{
cout << __FUNCTION__ << endl;
}
int varC;
};
using pMemFunc = void(*)(); // 定义函数指针,C++11新语法
int _tmain(int argc, _TCHAR* argv[])
{
ClassB *pB = new ClassB();
ClassB *pC = new ClassC();
int SizeofBase = sizeof(BaseA); // SizeofBase 值为8
int SizdofClassB = sizeof(ClassB); // SizdofClassB 值为12
int SizdofClassC = sizeof(ClassC); // SizdofClassC 值为16
BaseA *pAB = (BaseA *)pB;
BaseA *pAC = (BaseA *)pC;
ClassB *pBC = (ClassB *)pC;
pAB->TestA(); // 输出 ClassB::TestA
pAC->TestA(); // 输出 ClassC::TestA
pBC->TestB(); // 输出 ClassC::TestB
// 直接访问虚函数表
long *pVftableB = (long*)*((long *)pAB);
// 得到虚函数表中的索引为1的函数地址,在VS编译器中,虚拟析构函数在虚函数表的第一个位置
pMemFunc pTestA = (pMemFunc)(pVftableB[1]);
pTestA(); // 输出 ClassB::TestA
pMemFunc pTestB = (pMemFunc)(pVftableB[2]);
pTestB(); // 输出 ClassB::TestB
long * pVftableC = (long*)*((long *)pC);
pTestA = (pMemFunc)(pVftableC[1]);
pTestA(); // 输出 ClassC::TestA
pTestB = (pMemFunc)(pVftableC[2]);
pTestB(); // 输出 ClassC::TestB
pMemFunc pTestC = (pMemFunc)(pVftableC[3]);
pTestC(); // 输出 ClassC::TestC
delete pB;
// 依次输出
// ClassB::~ClassB
// ClassB::TestA
// BaseA::~BaseA
// BaseA::TestA
delete pC;
// 依次输出
// ClassC::TestA
// ClassB::~ClassB
// ClassB::TestA
// BaseA::~BaseA
// BaseA::TestA
return 0;
}