程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> MSSQL >> c++基本語法:虛繼續

c++基本語法:虛繼續

編輯:MSSQL

c++基本語法:虛繼續。本站提示廣大學習愛好者:(c++基本語法:虛繼續)文章只能為提供參考,不一定能成為您想要的結果。以下是c++基本語法:虛繼續正文


虛繼續 的概念的提出重要是為懂得決C++多繼續的成績,舉個最簡略的例子:

class animal{
        public :
              void op()
                  {cout << "hello animal" ;}
 };
class tiger : public animal {
        public :
              void tg()
                  {cout << "this is  tiger" ;}
};
class lion : public animal {
        public :
              void lo()
                  {cout << "this is lion" ;}
};
class liger : public tiger, public lion {
        public :
              void lo()
                  {cout << "this is lion" ;}
};
int main()
{
     class liger  oneliger ;
     liger.op() ; 
}

下面的 liger.op() ;會報錯,會提醒隱約的成員變量,由於tiger和lion中都包括父類animal的op()操作。
此時內存中的oneliger對象結構從低到高是上面如許的:
1、animal的成員變量

2、繼續tiger的成員變量
      //包含 op()

3、繼續lion的成員變量
     / /也包含op()

4、liger自己的成員變量

PS: 對象在內存中的結構起首是假如有虛函數的話就是虛表,虛表就是指向一個函數指針數組的指針,然後就是成員變量,假如是通俗繼續則起首是最根父類的成員變量,然後是次父類成員變量,順次而來最初是自己的成員變量[虛繼續相反],成員函數被編譯玉成局函數不存儲在對象空間內,須要挪用成員函數的時刻,經由過程類名找到響應的函數,然後將對象的this指針傳給函數:

好比如許的代碼 
CTest     test; 
test.print(); 

編譯器在外部將轉換為:(偽代碼) 
CTest   test; 
CTest_print(   &test   );   //   CTest的print函數轉換為:CTest_print(   CTest*   const   this); 

所以這就和通俗函數挪用差異不年夜了
現實應當是函數找到對象,即依據this指針

為懂得決 下面多繼續的成績,所以c++中提出了虛繼續的概念,虛繼續就是在子類中只保存一份父類的拷貝,拿下面的類子來講,就是“假如有一份父類的拷貝的話就用父類的拷貝,假如沒有就參加一份拷貝” :

class animal{
        public :
              void op()
                  {cout << "hello animal" ;}
 };
class tiger : public virtual animal {
        public :
              void tg()
                  {cout << "this is  tiger" ;}
};
class lion : public virtual animal {
        public :
              void lo()
                  {cout << "this is lion" ;}
};
class liger : public tiger, public lion {
        public :
              void lo()
                  {cout << "this is lion" ;}
};
int main()
{
     class liger  oneliger ;
     liger.op() ; 
}

此時liger對象在內存中的結構就釀成了:
4、animal的成員變量

3、繼續tiger的成員變量
      //包含 op()

2、繼續lion的成員變量
     //曾經包括一份拷貝,所以 曾經不包含op()

1、liger自己的成員變量

如許內存中就只要一份animal對象的拷貝,所以就不會存在隱約的成績;

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