日度归档:2018年12月10日

通过对象地址获取对象的虚函数列表

1、C++中多态是一种泛型编程思想,虚函数是实现这个思想的语法基础;

2、虚函数列表简称虚表,出现在对象的头部,即虚表的首地址即对象地址;

3、通过创建好的对象,可以得到虚表,从而通过偏移可获取所有虚函数的地址;

4、示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
using namespace std;
// Person类定义
class Person{
public:
    virtual void MethodOne(){   // 虚函数
        cout << __func__ << endl;
    }
    virtual void MethodTwo(){   // 虚函数
        cout << __func__ << endl;
    }
};
// Student类定义
class Student: public Person{
 
};
// 定义一个指向函数的指针类型
typedef void (*method)();
int main(int argc, const char *argv[]){
    Person *p = new Student();
    // 1、对象地址即虚表地址(对象的头部即虚表)
    // 2、取变量p的值得到虚表地址(强转为指向函数指针的数组)
    method *method_map = (method *)*(method*)p;
    // 虚函数数组中取值,单个对象为函数体地址
    method method1 = *method_map[0];
    method method2 = *method_map[1];
    method1();
    method2();
    return 0;
}

5、执行结果:

MethodOne
MethodTwo
Program ended with exit code: 0