C++利用地址访问虚函数

来源:互联网 发布:2017装修手机淘宝主页 编辑:程序博客网 时间:2024/06/07 06:02
//学习目标:虚函数地址#include "stdafx.h"#include <iostream>using namespace std;//typedef void(*func)(void);函数别名 typedef void(__stdcall *func)(int);//如果构造有参数,则使用这个写法的别名class A{public:int a;virtual void show(int a){cout << "小测" << endl;}virtual void format(int a){cout << "222" << endl;}//虚函数比普通类多4字节,存储虚函数指针。成员函数不占类的空间//地址相差15个字节 3个4字节};class B:public A{public:void show(){cout << "bbbb" << endl;}};int _tmain(int argc, _TCHAR* argv[]){A a;func fp = NULL;A* pr = new A; //a.format();//B b;//b.show();a.show(2);cout << sizeof(A)<<endl;//cout << sizeof(B)<<endl;cout << &a << endl;//cout << &(a.a) << endl;cout << sizeof(a) << endl;//解引用cout << (void*)(*((int*)(&a))) << endl;cout << (int*)(*((int*)(*((int*)(&a))))) << endl;//虚函数列表cout << "虚函数对象: " << (int*)(&a) << endl;cout << "虚函数表首指针地址: " << (int*)*(int*)(&a) << endl;cout << "A虚函数表内第一个函数指针地址: " << (func)*(int*)*(int*)(&a)<< endl;cout << "B虚函数表内第一个函数指针地址: " << (func)*(int*)*(int*)(&a)<< endl;cout << "利用虚函数地址来访问函数:" << endl;//利用地址访问虚函数for (int i = 0; i != 2; ++i){fp = (func)*(((int*)*(int*)(&a)) + i);fp(2);}while(1);return 0;}

原创粉丝点击