国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++中virtual繼承的深入理解

2020-01-26 16:04:02
字體:
來源:轉載
供稿:網友
今天專門看了一下虛繼承的東西,以前都沒怎么用過,具體如下:
父類: 
復制代碼 代碼如下:

class   CParent
{
....
};
繼承類的聲明比較特別:
class   CChild   :   virtual   public   CParent
{
....


請問,這個"virtual"是什么作用及含義?
---------------------------------------------------------------
表示虛擬繼承,和普通繼承是C++的兩種繼承方式。
例如B1、B2   繼承A   而C多重繼承B1、B2
如果普通繼承則C包含兩份A的拷貝,分別來自于B1、B2
而虛擬繼承則只包含一份A的拷貝
---------------------------------------------------------------
這個"virtual"是什么作用及含義?
證明這個CParent是CChild   的虛基類
虛基類   的   作用
虛基類是指:class   SubClass   :   virtual   public   BaseClass   中以virtual聲明的基類??!由于C++支持多重繼承,所以對于一個派生類中有幾個直接父類,而幾個直接父類中有幾個可能分別繼承自某一個基類(就是父類的父類),這樣在構造最終派生類時,會出現最終派生類中含有多個同一個基類的情況,就會產生二義性的問題(不知道該調用哪個基類的成員變量和函數),為解決此問題,需要使用虛基類,即只對此基類生成一塊內存區域,這樣最終派生類中就只會含有一個基類了
典型的需要用虛基類的情況如下:
                        A
                      /   /
                    B       C
                      /   /
                        D
其中D繼承自BC,BC分別繼承自A,所以A要分別被BC虛擬繼承
程序嘛………… 
復制代碼 代碼如下:

class   A   {
    public:
        void   printA()   {cout<<"this   is   A/n";}
};
class   B:virtual   public   A;
class   C:virtual   public   A;
class   D:public   B,public   C; 

這樣在D構造出來后,它的存儲區域中只有一個A,不會有二義性問題
比如:D   d=new   D;
此時若使用d.printA();不會有問題;但若B和C不是虛繼承自A,就會有二義性問題
COM中 多重繼承不采用虛擬繼承, 否則會導致與COM不兼容的vtbl。若 IX 和 IY 按照虛擬繼承方式繼承IUnknown,那么 IX 和 IY 的vtbl中的頭三個函數指向的將不是IUnknown的三個成員函數(詳見Com技術內幕)
IUnknown        ->            IX                       
                                                    --->        CA
IUnknown        ->            IY
通常將一種類型的指針轉換成另外一種類型的指針并不會改變指針的值,但為了支持多重繼承,在某些情況下,C++必須改變類指針的值。COM中的多接口繼承就是如此,此時
CA* pA = new CA();
IY * pc = pA;          會被編譯器改成   IY * pC = (char * )pA + deltaIY(一個偏移量);
基類的析構函數也應該定義成virtual才會在繼承類的實例析構時被調用以清除基類用到的資源。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 吴桥县| 新源县| 曲松县| 亚东县| 延寿县| 桐梓县| 云霄县| 平邑县| 潮州市| 洪洞县| 宜章县| 宁化县| 湘阴县| 武鸣县| 昭通市| 茶陵县| 宁都县| 鸡泽县| 兰州市| 安塞县| 中西区| 珠海市| 南阳市| 岳普湖县| 定结县| 汽车| 临西县| 石首市| 刚察县| 青州市| 古浪县| 宁安市| 闽侯县| 任丘市| 布尔津县| 七台河市| 晋宁县| 高邮市| 南岸区| 额敏县| 维西|