C++类的虚函数表

来源:互联网 发布:师洋的淘宝店是正品吗 编辑:程序博客网 时间:2024/06/06 23:35
#include <iostream>using namespace std;typedef void(*Fun)();class CExample{private:void virtual vir_function1(){cout<<"this is virtual fuction1"<<endl;}void virtual vir_function2(){cout<<"this is virtual fuction2"<<endl;}void virtual vir_function3(){cout<<"this is virtual fuction3"<<endl;}};int main(){CExample obj;Fun pfun1 = NULL;Fun pfun2 = NULL;Fun pfun3 = NULL;pfun1 = (Fun)*((int*)*(int*)(&obj) + 0);pfun2 = (Fun)*((int*)*(int*)(&obj) + 1);pfun3 = (Fun)*((int*)*(int*)(&obj) + 2);cout<<"obj首地址:"<<&obj<<endl;//对象的首地址存放的是虚函数集首地址的指针。cout<<"第一个虚函数的地址是:"<<pfun1<<endl;cout<<"第二个虚函数的地址是:"<<pfun2<<endl;cout<<"第三个虚函数的地址是:"<<pfun3<<endl;pfun1();pfun2();pfun3();return 0;}


类的成员首地上,存储了一个指针,这个指针指向虚函数表。虚函数表中存储了虚函数的函数指针。

2、存在类单继承时

#include <iostream>using namespace std;typedef void(*Fun)();class CExample{private:void virtual vir_function1(){cout<<"this is virtual fuction1"<<endl;}void virtual vir_function2(){cout<<"this is virtual fuction2"<<endl;}void virtual vir_function3(){cout<<"this is virtual fuction3"<<endl;}};class Derived:private CExample{private:void virtual vir_der_fun1(){cout<<"this is vir_der_fun1"<<endl;}void virtual vir_der_fun2(){cout<<"this is vir_der_fun2"<<endl;}void virtual vir_der_fun3(){cout<<"this is vir_der_fun3"<<endl;}};int main(){Derived obj;Fun pfun1 = NULL;Fun pfun2 = NULL;Fun pfun3 = NULL;Fun pfun4 = NULL;Fun pfun5 = NULL;Fun pfun6 = NULL;pfun1 = (Fun)*((int*)*(int*)(&obj) + 0);pfun2 = (Fun)*((int*)*(int*)(&obj) + 1);pfun3 = (Fun)*((int*)*(int*)(&obj) + 2);pfun4 = (Fun)*((int*)*(int*)(&obj) + 3);pfun5 = (Fun)*((int*)*(int*)(&obj) + 4);pfun6 = (Fun)*((int*)*(int*)(&obj) + 5);cout<<"obj首地址:"<<&obj<<endl;//对象的首地址存放的是虚函数集首地址的指针。cout<<"第一个虚函数的地址是:"<<pfun1<<endl;cout<<"第二个虚函数的地址是:"<<pfun2<<endl;cout<<"第三个虚函数的地址是:"<<pfun3<<endl;cout<<"第四个虚函数的地址是:"<<pfun4<<endl;cout<<"第五个虚函数的地址是:"<<pfun5<<endl;cout<<"第六个虚函数的地址是:"<<pfun6<<endl;pfun1();pfun2();pfun3();pfun4();pfun5();pfun6();return 0;}


3、类的多重继承

#include <iostream>using namespace std;typedef void(*Fun)();class Base1{private:void virtual vir_function1(){cout<<"this is virtual fuction1"<<endl;}void virtual vir_function2(){cout<<"this is virtual fuction2"<<endl;}void virtual vir_function3(){cout<<"this is virtual fuction3"<<endl;}};class Base2{private:void virtual vir_function4(){cout<<"this is virtual fuction4"<<endl;}void virtual vir_function5(){cout<<"this is virtual fuction5"<<endl;}void virtual vir_function6(){cout<<"this is virtual fuction6"<<endl;}};class Derived:private Base1,private Base2{private:void virtual vir_der_fun1(){cout<<"this is vir_der_fun1"<<endl;}void virtual vir_der_fun2(){cout<<"this is vir_der_fun2"<<endl;}void virtual vir_der_fun3(){cout<<"this is vir_der_fun3"<<endl;}};int main(){Derived obj;Fun pfun1 = NULL;Fun pfun2 = NULL;Fun pfun3 = NULL;Fun pfun4 = NULL;Fun pfun5 = NULL;Fun pfun6 = NULL;Fun pB2_1 = NULL;Fun pB2_2 = NULL;Fun pB2_3 = NULL;pfun1 = (Fun)*((int*)*(int*)(&obj) + 0);pfun2 = (Fun)*((int*)*(int*)(&obj) + 1);pfun3 = (Fun)*((int*)*(int*)(&obj) + 2);pfun4 = (Fun)*((int*)*(int*)(&obj) + 3);pfun5 = (Fun)*((int*)*(int*)(&obj) + 4);pfun6 = (Fun)*((int*)*(int*)(&obj) + 5);pB2_1 = (Fun)*((int*)*(int*)((int*)(&obj)+1)+0);pB2_2 = (Fun)*((int*)*(int*)((int*)(&obj)+1)+1);pB2_3 = (Fun)*((int*)*(int*)((int*)(&obj)+1)+2);cout<<"obj首地址:"<<&obj<<endl;//对象的首地址存放的是虚函数集首地址的指针。cout<<"第一个虚函数的地址是:"<<pfun1<<endl;cout<<"第二个虚函数的地址是:"<<pfun2<<endl;cout<<"第三个虚函数的地址是:"<<pfun3<<endl;cout<<"第四个虚函数的地址是:"<<pfun4<<endl;cout<<"第五个虚函数的地址是:"<<pfun5<<endl;cout<<"第六个虚函数的地址是:"<<pfun6<<endl;cout<<"Base2, 第一个虚函数:"<<pB2_1<<endl;cout<<"Base2, 第二个虚函数:"<<pB2_2<<endl;cout<<"Base2, 第三个虚函数:"<<pB2_3<<endl;pfun1();pfun2();pfun3();pfun4();pfun5();pfun6();pB2_1();pB2_2();pB2_3();return 0;}


1 0
原创粉丝点击