C++ 多重继承 计算虚表指针及虚函数地址
2018-03-06 09:56
615 查看
C++ 类的虚表位于类内存的开始位置
上代码:class base{
public:
base(){};
~base(){};
private:
virtual void a(){printf("base a\n");}//特意设定为私有,通过虚函数表地址可以访问
public :
virtual void b(){printf("base b\n");}
virtual void c(){printf("base c\n");}
};
class base1{
public:
base1(){};
~base1(){};
public :
virtual void a(){printf("base1 a\n");}
virtual void b(){printf("base1 b\n");}
virtual void c(){printf("base1 c\n");}
};
class base2{
public:
base2(){};
~base2(){};
public :
virtual void a(){printf("base2 a\n");}
virtual void b(){printf("base2 b\n");}
virtual void c(){printf("base2 c\n");}
};
class Drive1 : public base ,public base1 , public base2{
virtual void c(){printf("Drive1 c\n");}
};
上代码:class base{
public:
base(){};
~base(){};
private:
virtual void a(){printf("base a\n");}//特意设定为私有,通过虚函数表地址可以访问
public :
virtual void b(){printf("base b\n");}
virtual void c(){printf("base c\n");}
};
class base1{
public:
base1(){};
~base1(){};
public :
virtual void a(){printf("base1 a\n");}
virtual void b(){printf("base1 b\n");}
virtual void c(){printf("base1 c\n");}
};
class base2{
public:
base2(){};
~base2(){};
public :
virtual void a(){printf("base2 a\n");}
virtual void b(){printf("base2 b\n");}
virtual void c(){printf("base2 c\n");}
};
class Drive1 : public base ,public base1 , public base2{
virtual void c(){printf("Drive1 c\n");}
};
int main() { typedef void (*Fun)(); Drive1 ob; int *vptr = (int *)(*((int *)(&ob))); printf("第一个父类虚函数表的地址:0x%08X\n",vptr); // printf("第一个虚函数的地址:0x%08X\n",vptr[0]); // printf("第二个虚函数的地址:0x%08X\n",vptr[1]); // printf("第三个虚函数的地址:0x%08X\n",vptr[2]); Fun fff = (Fun)vptr[0]; fff(); fff = (Fun)vptr[1]; fff(); fff = (Fun)vptr[2]; fff(); vptr = (int *)(*((int*)(&ob)+1)); printf("第二个父类虚函数表的地址:0x%08X\n",vptr); fff = (Fun)vptr[0]; fff(); fff = (Fun)vptr[1]; fff(); fff = (Fun)vptr[2]; fff(); vptr = (int *)(*((int*)(&ob)+2)); printf("第三个父类虚函数表的地址:0x%08X\n",vptr); fff = (Fun)vptr[0]; fff(); fff = (Fun)vptr[1]; fff(); fff = (Fun)vptr[2]; fff(); system("pause"); return 0; }输出:
相关文章推荐
- [C++] 虚指针,虚表,虚函数地址打印
- C++反汇编第三讲,反汇编中识别虚表指针,以及指向的虚函数地址
- C++虚函数:虚指针、虚表、虚函数入口地址
- C++中虚函数工作原理和(虚)继承类的内存占用大小计算
- C++中虚函数工作原理和(虚)继承类的内存占用大小计算
- x86代码移植到x64下,如何访问虚表和虚函数指针,使用地址调用虚函数
- C++ 虚函数 获取C++虚表地址和虚函数地址
- C++ vptr vtbl (C++虚表指针,虚函数表,虚函数的实现)很多人都喜欢问这个,写下吧。
- C++中虚函数工作原理和(虚)继承类的内存占用大小计算
- C++中虚函数工作原理和(虚)继承类的内存占用大小计算
- C++中虚函数工作原理和(虚)继承类的内存占用大小计算
- c++函数中的 指针参数跟地址参数区别
- C++中动多态实现之虚函数与虚表指针
- C++中虚函数工作原理和(虚)继承类的内存占用大小计算
- C++中虚函数工作原理和(虚)继承类的内存占用大小计算
- C++中虚函数、虚表、虚指针实例讲解
- C++中虚函数工作原理和(虚)继承类的内存占用大小计算
- C++中虚函数工作原理和(虚)继承类的内存占用大小计算
- C++语言笔试题目写一个函数计算当参数为n(n很大)时的值 1-2+3-4+5-6+7......+n&字符指针、浮点数指针、以及函数指针占用的内存等
- C++中虚函数工作原理和(虚)继承类的内存占用大小计算