/** @file test.c
* @note
* @brief 字符串解析
* @author
* @date
* @note 没有任何具体价值,单纯的字符串解析、转换的编程练习
* @note 历史记录:
* @warning
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
using namespace std;
class A
{
virtual void func1()
{
cout << "A::func1()" << endl;
}
virtual void func2()
{
cout << "A::func2()" << endl;
}
protected:
int _a;
};
class B
{
virtual void func1()
{
cout << "B::func1()" << endl;
}
virtual void func2()
{
cout << "B::func2()" << endl;
}
protected:
int _b;
};
class C : public A//, public B
{
/*virtual void func1()
{
cout << "C::func1()" << endl;
}
virtual void func3()
{
cout << "C::func3()" << endl;
}*/
protected:
int _c;
};
typedef void(*FUNC)(); //声明一个函数指针类型FUNC
void printTable(long long *vfptr)
{
printf("vtable address:%p\n", vfptr);
for (int i = 0; vfptr[i] != 0; i++)
{
printf("第%d个虚函数地址:%p->", i, vfptr[i]);
FUNC f = (FUNC)(vfptr[i]);
f(); //调用这个函数
}
printf("\n");
}
int main()
{
A a;
B b;
C c;
cout << sizeof(c) << endl;
//因为c有两个直接父类:A和B
long long *vfptr1 = (long long*)(*((long long*)(&c)));
printTable(vfptr1);
//因为第二个虚表指针存放在第一个父类成员变量下边,所以第二个虚表指针在&c后需要加上第一个父类的大小,
//但是由于指针+1,加的是所指类型的大小,所以需要把&a强转为char*,或者+sizeof(A)/4,
/*int *vfptr2 = (int*)(*(int*)(((char*)(&c)) + sizeof(A)));
printTable(vfptr2);*/
system("pause");
return 0;
}
通过指针访问虚函数表,并且调用里面的方法
最新推荐文章于 2022-05-06 19:46:10 发布