test virtual table

来源:互联网 发布:java webservice加密 编辑:程序博客网 时间:2024/06/12 08:55

//test_class.cpp#include <iostream>using namespace std;class base{public:int val;int val2;virtual void print_this(){cout<<"base this is :"<<this<<endl;}void * get_this(void) {return this;}base() {val = 0;val2 = 2;}};class a :public base{public:int val;void print_this(){cout<<"a this is :"<<this<<endl;}void * get_this(void) {return this;}a() {val = 1;}};typedef void (*VP)(void);int main(){a va;unsigned int addr_a = (unsigned int)&va;unsigned int addr_a_val = (unsigned int)&va.val;unsigned int local_val = 100;cout<<"addr_a:"<<addr_a<<endl;cout<<"addr_a_val:"<<addr_a_val<<endl;cout<<"sizeof a:"<<sizeof(a)<<endl;cout<<"sizeof base:"<<sizeof(base)<<endl;cout<<"a val:"<<va.val<<endl;va.print_this();va.base::print_this();unsigned int *temp = (unsigned int*)va.get_this();cout<<"get_this:"<<temp<<endl;cout<<"temp[0]:"<<temp[0]<<endl;/*virtual table*/cout<<"temp[1]:"<<temp[1]<<endl;/*base.val*/cout<<"temp[2]:"<<temp[2]<<endl;/*base.val2*/cout<<"temp[3]:"<<temp[3]<<endl;/*a.val*/cout<<"temp[4]:"<<temp[4]<<endl;/*addr_a*/cout<<"temp[5]:"<<temp[5]<<endl;/*addr_a_val*/cout<<"temp[6]:"<<temp[6]<<endl;/*local_val*/temp = (unsigned int *)temp[0];cout<<endl<<"temp:"<<temp<<endl;cout<<"temp[0]:"<<temp[0]<<endl;cout<<"temp[1]:"<<temp[1]<<endl;VP *virtual_array = (VP *)(temp);virtual_array[0]();/*子类的虚函数覆盖了父类的方法*/return 0;}Makefile:CFLAG := "C:\Program Files (x86)\CodeBlocks\MinGW\lib\gcc\mingw32\4.4.1"all: testclass.cppg++ testclass.cpp -S -o testclass.sas testclass.s -o testclass.og++ testclass.o -o testclass -L$(CFLAG)./testclass.execlean:rm testclass.exe