多继承(含虚函数覆盖)vftb中虚函数排列

来源:互联网 发布:linux查询ip 编辑:程序博客网 时间:2024/05/18 02:43
#include <iostream>#include <string>#include <vector>#include <cctype>using namespace std;//多继承(有虚函数覆盖)//1) 每个父类都有自己的虚表,有多少个父类就有多少个虚指针//2) 子类的所有虚函数地址被放到了第一个父类的虚函数表中(排列顺序:先基类虚函数地址后子类虚函数地址,若覆盖了第一个父类中的虚函数,      则地址变为派生类override的虚函数地址;若没有覆盖,则仍未原父类虚函数地址)。(所谓的第一个父类是按照声明顺序来判断的)//3)  若子类override了第二个及其之后的基类的虚函数,则在第二个vftp及之后的 vftp所对应的虚函数表中更改派生类override的虚函数地址。//图片中红色标出的虚函数为派生类新增的,放在第一个虚函数表尾部;蓝色标出的为派生类覆盖基类的虚函数 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;}    //新增fvirtual void g1(){cout << "Derive::g1" << endl;}  //覆盖Base1的g1//virtual void f2(){cout << "Derive::f2" << endl;}  //覆盖Base2的f2virtual void g3(){cout << "Derive::g3" << endl;}  //覆盖Base3的g3virtual void myfun1(){cout << "Derive::myfun1" << endl;}    //新增myfun1virtual void myfun2(){cout << "Derive::myfun2" << endl;}    //新增myfun2};typedef void (*Fun)();int main(){Fun pFun;Derive derive;Derive *de = &derive;//通过获取private虚函数指针,如下((Fun)((*q)[3]))实现访问!void*** q1 = (void***)&derive;  cout<<*q1<<endl;    // Base1Subobj 的 vptr,即指向Base1的虚函数表;cout<<**q1<<endl;   // 没有覆盖,指向Base1的f1虚函数cout<<*(*q1+1)<<endl;  // 覆盖基类g1,指向Derive的g1虚函数cout<<*(*q1+2)<<endl;  // 指向Derive新增的f虚函数cout<<*(*q1+3)<<endl;  // 指向Derive新增的myfun1虚函数cout<<*(*q1+4)<<endl;  // 指向Derive新增的myfun2虚函数pFun = (Fun)(**q1);  //pFun为指向Base1::f1()的指针pFun();pFun = (Fun)(*(*q1+1));  //pFun为指向Derive::g1()的指针pFun();pFun = (Fun)(*(*q1+2));   //pFun为指向Derive::f()的指针pFun();pFun = (Fun)(*(*q1+3));   //pFun为指向Derive::myfun1的指针pFun();pFun = (Fun)(*(*q1+4));   //pFun为指向Derive::myfun2的指针pFun();system("pause");return 0;}

0 0