青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

C++多繼承中的二義性

多繼承可以看作是單繼承的擴展。所謂多繼承是指派生類具有多個基類,派生類與每個基類之間的關系仍可看作是一個單繼承。

    多繼承下派生類的定義格式如下:

    class <派生類名>:<繼承方式1><基類名1>,<繼承方式2><基類名2>,…

    {

    <派生類類體>

    };

    其中,<繼承方式1>,<繼承方式2>,…是三種繼承方式:public、private、protected之一。例如:

    class A

    {

    …

    };

    class B

    {

    …

    };

    class C : public A, public B

    {

    …

    };

    其中,派生類C具有兩個基類(類A和類B),因此,類C是多繼承的。按照繼承的規定,派生類C的成員包含了基類A, B中成員以及該類本身的成員。

    多繼承的構造函數

    在多繼承的情況下,派生類的構造函數格式如下:

    <派生類名>(<總參數表>):<基類名1>(<參數表1>),<基類名2>(<參數表2>),…

    <子對象名>(<參數表n+1>),…

    {

    <派生類構造函數體>

    }

    其中,<總參數表>中各個參數包含了其后的各個分參數表。

    多繼承下派生類的構造函數與單繼承下派生類構造函數相似,它必須同時負責該派生類所有基類構造函數的調用。同時,派生類的參數個數必須包含完成所有基類初始化所需的參數個數。

    派生類構造函數執行順序是先執行所屬基類的構造函數,再執行派生類本身構造函數,處于同一層次的各基類構造函數的執行順序取決于定義派生類時所指定的各基類順序,與派生類構造函數中所定義的成員初始化列表的各項順序無關。也就是說,執行基類構造函數的順序取決于定義派生類時基類的順序。可見,派生類構造函數的成員初始化列表中各項順序可以任意地排列。

    下面通過一個例子來說明派生類構造函數的構成及其執行順序。

    #include <iostream.h>

    class B1

    {

    public:

    B1(int i)

    {

    b1 = i;

    cout《"構造函數 B1."《i《 endl;

    }

    void print()

    {

    cout《"B1.print()"《b1《endl;

    }

    private:

    int b1;

    };

    class B2

    {

    public:

    B2(int i)

    {

    b2 = i;

    cout《"構造函數 B2."《i《 endl;

    }

    void print()

    {

    cout《"B2.print()"《b2《endl;

    }

    private:

    int b2;

    };

    class B3

    {

    public:

    B3(int i)

    {

    b3 = i;

    cout《"構造函數 B3."《i《endl;

    }

    int getb3()

    {

    return b3;

    }

    private:

    int b3;

    };

    class A : public B2, public B1

    {

    public:

    A(int i, int j, int k, int l):B1(i), B2(j), bb(k)

    {

    a = l;

    cout《"構造函數 A."《a《endl;

    }

    void print()

    {

    B1::print();

    B2::print();

    cout《"A.print()"《a《","《bb.getb3()《endl;

    }

    private:

    int a;

    B3 bb;

    };

    void main()

    {

    A aa(1, 2, 3, 4);

    aa.print();

    }


該程序的輸出結果為:

    構造函數 B2.2

    構造函數 B1.1

    構造函數 B3.3

    構造函數 A.4

    B1.print()。1

    B2.print()2

    A.print()4, 3

    在該程序中,作用域運算符::用于解決作用域沖突的問題。在派生類A中的print()函數的定義中,使用了B1::print;和B2::print();語句分別指明調用哪一個類中的print()函數,這種用法應該學會。

    二義性問題

    一般說來,在派生類中對基類成員的訪問應該是唯一的,但是,由于多繼承情況下,可能造成對基類中某成員的訪問出現了不唯一的情況,則稱為對基類成員訪問的二義性問題。

    實際上,在上例已經出現過這一問題,回憶一下上例中,派生類A的兩基類B1和B2中都有一個成員函數print()。如果在派生類中訪問 print()函數,到底是哪一個基類的呢?于是出現了二義性。但是在上例中解決了這個問題,其辦法是通過作用域運算符::進行了限定。如果不加以限定,則會出現二義性問題。

    下面再舉一個簡單的例子,對二義性問題進行深入討論。例如:

    class A

    {

    public:

    void f();

    };

    class B

    {

    public:

    void f();

    void g();

    };

    class C : public A, public B

    {

    public:

    void g();

    void h();

    };

    如果定義一個類C的對象c1:

    C c1;

    則對函數f()的訪問

    c1.f();

    便具有二義性:是訪問類A中的f(),還是訪問類B中的f()呢?

    解決的方法可用前面用過的成員名限定法來消除二義性,例如:

    c1.A::f();

    或者

    c1.B::f();

    但是,最好的解決辦法是在類C中定義一個同名成員f(),類C中的f()再根據需要來決定調用A::f(),還是B::f(),還是兩者皆有,這樣,c1.f()將調用C::f()。

    同樣地,類C中成員函數調用f()也會出現二義性問題。例如:

    viod C::h()

    {

    f();

    }

    這里有二義性問題,該函數應修改為:

    void C::h()

    {

    A::f();

    }

    或者

    void C::h()

    {

    B::f();

    }

    或者

    void C::f()

    {

    A::f();

    B::f();

    }

    另外,在前例中,類B中有一個成員函數g(),類C中也有一個成員函數g()。這時,

    c1.g();

    不存在二義性,它是指C::g(),而不是指B::g()。因為這兩個g()函數,一個出現在基類B,一個出現在派生類C,規定派生類的成員將支配基類中的同名成員。因此,上例中類C中的g()支配類B中的g(),不存在二義性,可選擇支配者的那個名字。

    當一個派生類從多個基類派生類,而這些基類又有一個共同的基類,則對該基類中說明的成員進行訪問時,也可能會出現二義性。例如:

    class A

    {

    public:

    int a;

    };

    class B1 : public A

    {

    private:

    int b1;

    };

    class B2 : public A

    {

    private:

    int b2;

    };

    class C : public B1, public B2

    {

    public:

    int f();

    private:

    int c;

    };

    已知:C c1;

    下面的兩個訪問都有二義性:

    c1.a;

    c1.A::a;

    而下面的兩個訪問是正確的:

    c1.B1::a;

    c1.B2::a;

    類C的成員函數f()用如下定義可以消除二義性:

    int C::f()

    {

    retrun B1::a + B2::a;

    }

    由于二義性的原因,一個類不可以從同一個類中直接繼承一次以上,例如:

    class A : public B, public B

    {

    …

    }

    這是錯誤的。

posted on 2012-03-20 22:31 一葉草 閱讀(546) 評論(0)  編輯 收藏 引用
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲精品一区在线观看| 亚洲国产精品一区| 中文在线不卡视频| 国产综合色精品一区二区三区| 午夜一区二区三视频在线观看 | 欧美日韩国产一区二区三区| 欧美一区二区在线看| 国产一区二区三区久久精品| 亚洲影院免费观看| 日韩一级免费| 欧美日韩成人在线观看| 亚洲国产婷婷香蕉久久久久久99| 久久久欧美精品sm网站| 欧美一区二区三区久久精品茉莉花| 欧美高清在线一区二区| 亚洲精品日韩精品| 亚洲日韩视频| 国产精品s色| 午夜精品婷婷| 亚洲欧美日韩专区| 国产亚洲观看| 欧美高清成人| 欧美精品在线一区| 亚洲影院在线观看| 欧美一区2区三区4区公司二百 | 久久精品国产99| 午夜一区不卡| 亚洲私人影院在线观看| 一个人看的www久久| 99视频热这里只有精品免费| 欧美婷婷久久| 久久久999成人| 老牛嫩草一区二区三区日本| 亚洲美女视频| 午夜久久99| 一区在线影院| 亚洲国产欧美日韩精品| 欧美日韩在线另类| 欧美一区三区三区高中清蜜桃 | 久久久av网站| 午夜精品成人在线| 免费欧美视频| 欧美日韩国产123| 亚洲免费网址| 欧美在线亚洲| 一区二区三区高清视频在线观看| 亚洲一区二区三区高清| 在线观看不卡| 99国产精品久久久久老师| 国产手机视频一区二区| 黑人一区二区| 久久爱www久久做| 久久精品视频在线| 久久国产精品久久国产精品| 亚洲美女色禁图| 在线观看成人小视频| 久久中文精品| 欧美成人一区二区三区| 久久精品国产欧美激情| 艳妇臀荡乳欲伦亚洲一区| 欧美激情日韩| 国产精品综合久久久| 性做久久久久久久久| 亚洲欧洲日本专区| 国产精品www网站| 欧美劲爆第一页| 久久视频在线视频| 欧美剧在线观看| 欧美日韩精品三区| 欧美刺激性大交免费视频| 久久国产一二区| 欧美gay视频| 免费不卡在线观看| 欧美日韩日日夜夜| 欧美国产一区二区三区激情无套| 欧美大片免费观看在线观看网站推荐| 欧美一区二区网站| 国产精品免费网站| 伊人狠狠色j香婷婷综合| 99精品视频网| 久久女同精品一区二区| 亚洲国产精品久久久| 国产一区二区三区丝袜| 激情综合自拍| 久久全国免费视频| 亚洲免费视频观看| 久久精品日韩| 欧美日韩国产欧美日美国产精品| 欧美欧美在线| 国产亚洲成年网址在线观看| 亚洲电影免费观看高清完整版在线| 最新国产成人在线观看| 一区二区三区精品在线 | 久久综合狠狠| 亚洲精品国久久99热| 亚洲视频在线观看三级| 久久综合婷婷| 国产美女精品视频| 久久天堂成人| 欧美日韩mv| 欧美日韩精品一区二区三区四区 | 久久九九久久九九| 日韩一级黄色av| 亚洲精选91| 欧美大片在线看| 91久久综合| 亚洲福利专区| 亚洲精品免费看| 中文在线一区| 欧美色视频在线| 亚洲一区观看| 久久久综合视频| 91久久在线播放| 欧美日韩三区四区| 亚洲午夜一二三区视频| 欧美一区二区播放| 狠狠色狠色综合曰曰| 久久亚洲国产成人| 亚洲国产精品视频| 亚洲欧美bt| 国产一区二区三区久久 | 国产亚洲激情在线| 麻豆久久久9性大片| 亚洲精品小视频在线观看| 亚洲综合色自拍一区| 国产亚洲一区二区三区| 蜜桃av一区| 久久精品中文| 欧美日本在线观看| 亚洲一区二区三区免费观看 | 99pao成人国产永久免费视频| 欧美成人乱码一区二区三区| 亚洲精品久久久久久久久久久久久| 亚洲少妇在线| 国产一区二区三区不卡在线观看| 免费国产一区二区| 一区二区三区黄色| 久久资源av| 亚洲视频在线一区| 伊人久久综合97精品| 一区二区三区 在线观看视| 欧美成人免费播放| 亚洲一区二区三区视频播放| 亚洲午夜电影在线观看| 美女视频一区免费观看| 中国女人久久久| 激情文学综合丁香| 欧美中在线观看| 亚洲新中文字幕| 亚洲国产一区二区三区a毛片| 欧美一区二区三区在线观看视频| 亚洲激情小视频| 国产真实乱偷精品视频免| 欧美日韩亚洲一区二区| 久久精品人人爽| 亚洲曰本av电影| 亚洲精品乱码久久久久久按摩观| 久久一区二区三区av| 亚洲已满18点击进入久久| 亚洲第一页中文字幕| 国产亚洲午夜| 欧美午夜一区| 欧美日韩色综合| 欧美电影打屁股sp| 久久夜色精品国产欧美乱极品| 亚洲欧美日韩一区| 亚洲伦理中文字幕| 亚洲娇小video精品| 欧美成人第一页| 久久久亚洲午夜电影| 欧美一区二区精美| 亚洲欧美日韩一区二区| 亚洲视频第一页| 亚洲伦理中文字幕| 亚洲人体影院| 亚洲国产精品免费| 亚洲国产mv| 亚洲国产日韩在线一区模特| 伊人久久男人天堂| 影音先锋久久精品| 在线观看视频免费一区二区三区| 久久久高清一区二区三区| 国产精品高清免费在线观看| 欧美精品成人一区二区在线观看 | 在线观看视频一区| 在线 亚洲欧美在线综合一区| 狠狠色丁香婷综合久久| 激情小说另类小说亚洲欧美| 国产一区91| 伊人久久大香线| 最新精品在线| 在线亚洲欧美| 午夜亚洲福利在线老司机| 欧美一级二区| 亚洲区国产区| 欧美成人国产一区二区| 欧美激情第8页| 欧美日韩www| 国产伦精品一区二区三区在线观看| 国产精品亚洲综合久久|