[C++] 虚指针,虚表,虚函数地址打印
2017-06-23 11:22
471 查看
#include <iostream> using namespace std; class Base { public : int base_data; Base() { base_data = 1; } virtual void func1() { cout << "base_func1" << endl; } virtual void func2() { cout << "base_func2" << endl; } virtual void func3() { cout << "base_func3" << endl; } }; class Derive : public Base { public : int derive_data; Derive() { derive_data = 2; } virtual void func1() { cout << "derive_func1" << endl; } virtual void func2() { cout << "derive_func2" << endl; } }; typedef void (*func)(); int main() { Base base; cout << "&base: " << &base << endl; cout << "&base.base_data: " << &base.base_data << endl; cout << "----------------------------------------" << endl; Derive derive; cout << "&derive: " << &derive << endl; cout << "&derive.base_data: " << &derive.base_data << endl; cout << "&derive.derive_data: " << &derive.derive_data << endl; cout << "----------------------------------------" << endl; for(int i=0; i<3; i++) { // &base : base首地址 // (unsigned long*)&base : base的首地址,vptr的地址 // (*(unsigned long*)&base) : vptr的内容,即vtable的地址,指向第一个虚函数的slot的地址 // (unsigned long*)(*(unsigned long*)&base) : vtable的地址,指向第一个虚函数的slot的地址 // vtbl : 指向虚函数slot的地址 // *vtbl : 虚函数的地址 unsigned long* vtbl = (unsigned long*)(*(unsigned long*)&base) + i; cout << "slot address: " << vtbl << endl; cout << "func address: " << *vtbl << endl; func pfunc = (func)*(vtbl); pfunc(); } cout << "----------------------------------------" << endl; for(i=0; i<3; i++) { unsigned long* vtbl = (unsigned long*)(*(unsigned long*)&derive) + i; cout << "slot address: " << vtbl << endl; cout << "func address: " << *vtbl << endl; func pfunc = (func)*(vtbl); pfunc(); } cout << "----------------------------------------" << endl; return 1; }
相关文章推荐
- C++学习笔记之:虚函数之虚表地址打印方法
- C++虚函数:虚指针、虚表、虚函数入口地址
- C++ 多重继承 计算虚表指针及虚函数地址
- C++反汇编第三讲,反汇编中识别虚表指针,以及指向的虚函数地址
- C/C++ 函数名 指针,地址 全析
- C++中动多态实现之虚函数与虚表指针
- C++ 从函数返回指针(函数外返回局部静态变量的地址)
- C/C++中关于地址、指针和引用变量的学习笔记(四) : 函数
- C++ 虚函数 获取C++虚表地址和虚函数地址
- c++多态性之虚函数与虚表指针
- Q13.3 关于虚表指针、虚函数表、虚函数表中虚函数地址
- C/C++学习(4)函数与指针取地址符
- C++ vptr vtbl (C++虚表指针,虚函数表,虚函数的实现)很多人都喜欢问这个,写下吧。
- C++中虚函数、虚表、虚指针实例讲解
- C++ 虚函数表解析(比较清楚,还可打印虚函数地址)
- 获取C++虚表地址和虚函数地址
- 如何打印虚表和虚函数指针的值(only for VS)
- (Boolan) C++ 类型大小和内存分布(虚函数指针、虚表、内存对齐问题)
- C++ 虚函数实现:虚函数表 虚表指针
- 浅谈C++虚表指针及虚函数表