首页 > 学院 > 开发设计 > 正文

菱形继承与菱形虚拟继承

2019-11-08 18:24:56
字体:
来源:转载
供稿:网友
菱形继承模型:菱形继承模型代码演示:#include<iostream>  using namespace std;    class Base  {  public:      Base()          :_b1(1){}      virtual void fun1()      {          cout << "Base1::fun1()" << endl;      }      virtual void fun2()      {          cout << "Base1::fun2()" << endl;      }  PRivate:      int _b1;  };  class Base2 :public Base  {  public:      Base2()          :_b2(1){}      virtual void fun1()      {      cout << "Base2::fun1()" << endl;      }      virtual void fun3()      {          cout << "Base2::fun2()" << endl;      }  private:      int _b2;  };  class Base3 :public Base  {  public:      Base3()          :_b3(1){}      virtual void fun1()      {          cout << "Base3::fun1()" << endl;      }      virtual void fun3()      {          cout << "Base3::fun2()" << endl;      }  private:      int _b3;  };  class Deriver :public Base2, public Base3  {  public:      Deriver()          :_d3(3){}      virtual void fun1()      {          cout << "Deriver::fun1()" << endl;      }      virtual void fun4()      {          cout << "Deriver::fun3()" << endl;      }  private:      int _d3;  };typedef void(*pfun)();void printfBase(pfun *_ppfun){ int i = 0; for (i = 0; _ppfun[i] != NULL; i++) {  _ppfun[i](); }}void test(){ Deriver d; printfBase((pfun*)*((int*)(&d))); printfBase((pfun*)*((int*)(&d)+3));}int main(){ test(); system("pause"); return 0;}此时根据监视窗口可观察到,Deriver的虚函数存放在第一个虚表的末尾处。菱形虚拟继承模型:代码实现如下:#include<iostream>  using namespace std;  class Base    {    public:        Base()  :_b1(1) { }   virtual void fun1()   {    cout << "Base1::fun1()" << endl;      }      virtual void fun2()      {              cout << "Base1::fun2()" << endl;      }  private:      int _b1;  };    class Base2:virtual public Base  {  public:      Base2()              :_b2(2) { }       virtual void fun1()      {              cout << "Base2::fun1()" << endl;      }      virtual void fun3()      {              cout << "Base2::fun2()" << endl;      }  private:      int _b2;  };  class Base3:virtual public Base  {  public:      Base3()              :_b3(3) { }      virtual void fun1()      {              cout << "Base3::fun1()" << endl;      }      virtual void fun3()      {              cout << "Base3::fun2()" << endl;      }  private:      int _b3;  };  class Deriver:public Base2,public Base3  {  public:      Deriver()              :_d4(4) { }      virtual void fun1()      {              cout << "Deriver::fun1()" << endl;      }        virtual void fun4()        {                cout << "Deriver::fun4()" << endl;       }  private: int _d4;    };};typedef void(*pfun)();void printfBase(pfun *_ppfun){int i = 0;for (i = 0; i<2&&_ppfun[i] != NULL; i++){_ppfun[i]();}}void test(){Deriver d;printfBase((pfun*)*((int*)(&d)));printfBase((pfun*)*((int*)(&d)+3));printfBase((pfun*)*((int*)(&d)+8));}int main(){test();system("pause");return 0;}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表