国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Sql Server - c++基礎語法:虛繼承

c++基礎語法:虛繼承

2020-01-15 15:35c++教程網 Sql Server

虛繼承概念的提出主要是為了解決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對象的拷貝,所以就不會存在模糊的問題;

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 成人看片在线 | 亚洲国产精品99久久久久久久久 | 一级片观看| 久久精品综合 | 亚洲视屏| 日韩精品一区二区在线观看视频 | av在线一区二区 | 午夜视频一区 | 国产精品一二区 | 国产视频亚洲 | 午夜视频在线播放 | 中文字幕亚洲欧美日韩在线不卡 | 高清av电影 | 99久久久无码国产精品 | 亚洲国产精品久久 | 午夜社区 | 精品久久久久久久中文字幕 | 欧洲毛片| 欧美日韩三区 | 91社区在线观看 | 欧美成人高清视频 | 成人在线一区二区 | 日韩中文一区二区 | yiren22成人网 | 亚洲精品视频在线观看网站 | 毛片免费观看视频 | 天天操天天干天天爽 | 欧美成人精精品一区二区频 | 国产免费久久精品 | 久久久天天| 婷婷国产 | 亚州ava| 日本久久久 | 久久丁香 | 色二区 | 美女久久久久 | 五月婷婷激情 | 色a综合 | 丁香亚洲| 欧美一级做a爰片久久高潮 免费在线毛片 | av黄色在线 |