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
- C/C++, 虚函数表
- C++:类的成员函数
- [c++]类的构造函数
- C++-类的构造函数
- [C/C++]C++中虚函数的原理和虚函数表
- [C/C++]C++中虚函数的原理和虚函数表
- C++:类的多态与虚函数的使用
- C/C++--虚函数
- 类的继承、抽象类、虚函数[C++]
- 纯C语言简单模拟C++的虚函数表
- C++ 多态的实现原理--虚函数表
- C语言模拟C++的虚函数表
- C++:抽象基类和纯虚函数的理解
- C++:抽象基类和纯虚函数的理解
- C++:抽象基类和纯虚函数的理解
- c++------------之---【虚函数和抽象基类的应用】
- [c/c++]函数的隐藏
- [C++]虚函数的虚继承
- android studio 导入github项目需要修改gradle信息
- Android 生命周期
- Linux下nginx安装
- oracle ----自定义异常
- React Native Android 从学车到补胎和成功发车经历
- C++类的虚函数表
- DisallowedHost: Invalid HTTP_HOST header: '192.168.0.136'. You may need to add u'192.168.0.136' to A
- POJ2246 水
- SpringMVC 笔记--拦截器--interceptor
- SAX解析示例
- Coursera Machine Learning 第三周 quiz Programming Exercise 2: Logistic Regression
- Redis和Memcache的区别分析
- 如何设置谷歌Chrome浏览器打开新的标签页为指定网页?
- boundingRectWithSize:options:attributes:context