多继承无虚函数覆盖下的vftb排列

来源:互联网 发布:java jre环境变量设置 编辑:程序博客网 时间:2024/05/18 01:12
#include <iostream>#include <string>#include <vector>#include <cctype>using namespace std;//多继承(无虚函数覆盖)//1) 每个父类都有自己的虚表,有多少个父类就有多少个虚指针//2) 子类的虚函数地址被放到了第一个父类的虚函数表中(排列顺序:先基类虚函数地址后子类虚函数地址)。(所谓的第一个父类是按照声明顺序来判断的)class Base1{public:int x1;virtual void f1(){cout << "Base1::f" << endl;}virtual void g1(){cout << "Base1::g" << endl;}};class Base2{public:int x2;virtual void f2(){cout << "Base2::f" << endl;}virtual void g2(){cout << "Base2::g" << endl;}};class Base3{public:int x3;virtual void f3(){cout << "Base3::f" << endl;}virtual void g3(){cout << "Base3::g" << endl;}};class Derive:public Base1,public Base2,public Base3{public:int y;virtual void f(){cout << "Derive::f" << endl;}virtual void g(){cout << "Derive::g" << endl;}};typedef void (*Fun)();int main(){Fun pFun;Derive derive;Derive *de = &derive;//通过获取private虚函数指针,如下((Fun)((*q)[3]))实现访问!void*** p = (void***)&derive;  cout<<*p<<endl;    // Base1Subobj 的 vptr,即指向Base1的虚函数表;cout<<**p<<endl;   // 指向Base1的f1虚函数cout<<*(*p+1)<<endl;cout<<*(*p+2)<<endl;  // 指向Derive的f虚函数cout<<*(*p+3)<<endl;  // 指向Derive的g虚函数pFun = (Fun)(**p);  //pFun为指向Base1::f1()的指针pFun();pFun = (Fun)(*(*p+1));  //pFun为指向Base1::g1()的指针pFun();pFun = (Fun)(*(*p+2));   //pFun为指向Derive::f()的指针pFun();pFun = (Fun)(*(*p+3));   //pFun为指向Derive::g()的指针pFun();system("pause");return 0;}

0 0
原创粉丝点击