程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 深入C++對象模型&虛函數表

深入C++對象模型&虛函數表

編輯:關於C++
多態的實現機制:

C++中虛函數的主要作用就是用來實現多態,就是使用基類的指針或者引用調用重寫的虛函數,當父類的指針或引用指向父類對象時調用的是父類虛函數,當指向子類對象時調用的是子類的虛函數。那麼這又是怎麼實現的呢???這都是通過虛函數表實現的,虛函數表是通過一塊連續內存來存儲虛函數的地址。這張表解決了虛函數重寫(地址進行覆蓋)的問題 。在有虛函數的對象實例中都有一張虛函數表,虛函數表就像一張地圖,指明了實際調用的虛函數函數。

例:
class Base
{
public:
       Base()
              :_b(1){}
       virtual void fun1()
       { }
       virtual void fun2()
       { }
private:
       int _b;
};

  虛函數表的最後一個元素是一個空指針。   既然我們知道了虛函數的地址,那麼就可以通過過找到這塊地址來調用這個虛函數。這也導致了多態的不安全性,效率降低。
typedef void (* pfun)();
void PrintfBase(pfun *_ppfun)
{
       int i = 0;
       for (i = 0; _ppfun[i] != NULL; i++)
       {
              _ppfun[i] ();
       }
}
void test()
{
       Base b;
       PrintfBase((pfun *)*((int *)(&b)));
}

\

 

 

  1、單繼承對象模型
class Base
{
public:
       Base()
              :_b(1){}
       virtual void fun1()
       {
              cout << "Base::fun1()" <

 

 

\

\

 

 

\

 

 

  2、多重繼承的對象模型  
class Base1
{
public:
       Base1()
              :_b1(1){}
       virtual void fun1()
       {
              cout << "Base1::fun1()" <<endl; :public="" base2="" cout="" deriver="" int="" pre="" private:="" public="" public:="" virtual="" void="">

\

\

\

3、菱形繼承的對象模型
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;
};

\

\

\

4、菱形的虛擬繼承
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()
              :_b4(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()
              :_d3(4){}
       virtual void fun1()
       {
              cout << "Deriver::fun1()" << endl;
       }
       virtual void fun4()
       {
              cout << "Deriver::fun4()" << endl;
       }
private:
       int _d4;
};
\

\

\

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved