标签:
//#include <vector>
//#include <bitset>
#include <stdio.h>
//#include <string.h>
//#include<malloc.h>
//#include<fstream>
//#include <stdexcept>
//#include <exception>
#include "t.h"
//#include <list>
//常量,变量,指针,引用。const。
//using namespace std;
//常量,只读变量。define
//void * add(int a,int b);
#include <iostream>
//#include <set>
using namespace std;
class Base {
public:
int a;
virtual void f() { cout << "Base::f" << endl; }
virtual void g() { cout << "Base::g" << endl; }
virtual void h() { cout << "Base::h" << endl; }
Base():a(4){}
};
class Base2 {
public:
int a;
virtual void f() { cout << "Base2::f" << endl; }
virtual void g1() { cout << "Base2::g1" << endl; }
virtual void h() { cout << "Base2::h" << endl; }
Base2():a(3){}
};
class Derive : public Base,public Base2{
public:
virtual void f() { cout << "Derive::f" << endl; }
virtual void e(){};
};
int main (int argc,char *argv[])
{
typedef void(*Fun)(void);
Base b;
Fun pFun = NULL;
printf( "Base.b add:%0x, value:%d\n" , &(b.a),*&(b.a));
printf( "虚函数表 - 指针:%0x\n" , &b );
printf( "虚函数表 — 第一个函数地址指针:%0x\n" , *(int *)(&b) );
printf( "虚函数表 — 第一个函数地址:%0x\n" , *(int *)*(int *)(&b) );
printf( "虚函数表 — 第二个函数地址:%0x\n" , *(int *)(*(int *)(&b)+4) );
printf( "虚函数表 — 第三个函数地址:%0x\n" , *(int *)(*(int *)(&b)+8) );
printf( "虚函数表 — 第四个函数地址:%0x\n\n" , *(int *)(*(int *)(&b)+12) );
cout<<"直接调用第一个函数的地址来测试是否正确:"<<endl;
pFun = (Fun) *(int *)*(int *)(&b);
pFun();
Derive d;
printf( "\n虚函数表 — 第一个函数地址:%0x\n" , *(int *)*(int *)(&d) );
printf( "虚函数表 — 第二个函数地址:%0x\n" , *(int *)(*(int *)(&d)+4) );
printf( "虚函数表 — 第三个函数地址:%0x\n" , *(int *)(*(int *)(&d)+8) );
printf( "虚函数表 — 第四个函数地址:%0x\n" , *(int *)(*(int *)(&d)+12) );
printf( "虚函数表 — 第五个函数地址:%0x\n\n" , *(int *)(*(int *)(&d)+16) );
printf( "\n虚函数表 — 第一个函数地址:%0x\n" , *(int *)*(int *) (int)&d+8 );//我的编译器会把第一个数据插到2个虚表中间。
d.g1();
return 0;
}
标签:
原文地址:http://www.cnblogs.com/lsfv/p/5575442.html