亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++中虛繼承時(shí)的構(gòu)造函數(shù)示例詳解

 更新時(shí)間:2023年09月06日 08:56:57   作者:向陽(yáng)逐夢(mèng)  
在虛繼承中,虛基類是由最終的派生類初始化的,換句話說(shuō),最終派生類的構(gòu)造函數(shù)必須要調(diào)用虛基類的構(gòu)造函數(shù),這跟普通繼承不同,在普通繼承中,派生類構(gòu)造函數(shù)中只能調(diào)用直接基類的構(gòu)造函數(shù),不能調(diào)用間接基類的,所以本文將通過(guò)代碼示例給大家介紹一下C++虛繼承構(gòu)造函數(shù)

在虛繼承中,虛基類是由最終的派生類初始化的,換句話說(shuō),最終派生類的構(gòu)造函數(shù)必須要調(diào)用虛基類的構(gòu)造函數(shù)。對(duì)最終的派生類來(lái)說(shuō),虛基類是間接基類,而不是直接基類。這跟普通繼承不同,在普通繼承中,派生類構(gòu)造函數(shù)中只能調(diào)用直接基類的構(gòu)造函數(shù),不能調(diào)用間接基類的。

下面我們以菱形繼承為例來(lái)演示構(gòu)造函數(shù)的調(diào)用:

    #include <iostream>
    using namespace std;
    //虛基類A
    class A{
    public:
        A(int a);
    protected:
        int m_a;
    };
    A::A(int a): m_a(a){ }
    //直接派生類B
    class B: virtual public A{
    public:
        B(int a, int b);
    public:
        void display();
    protected:
        int m_b;
    };
    B::B(int a, int b): A(a), m_b(b){ }
    void B::display(){
        cout<<"m_a="<<m_a<<", m_b="<<m_b<<endl;
    }
    //直接派生類C
    class C: virtual public A{
    public:
        C(int a, int c);
    public:
        void display();
    protected:
        int m_c;
    };
    C::C(int a, int c): A(a), m_c(c){ }
    void C::display(){
        cout<<"m_a="<<m_a<<", m_c="<<m_c<<endl;
    }
    //間接派生類D
    class D: public B, public C{
    public:
        D(int a, int b, int c, int d);
    public:
        void display();
    private:
        int m_d;
    };
    D::D(int a, int b, int c, int d): A(a), B(90, b), C(100, c), m_d(d){ }
    void D::display(){
        cout<<"m_a="<<m_a<<", m_b="<<m_b<<", m_c="<<m_c<<", m_d="<<m_d<<endl;
    }
    int main(){
        B b(10, 20);
        b.display();
        C c(30, 40);
        c.display();
        D d(50, 60, 70, 80);
        d.display();
        return 0;
    }

運(yùn)行結(jié)果:

m_a=10, m_b=20

m_a=30, m_c=40

m_a=50, m_b=60, m_c=70, m_d=80

請(qǐng)注意第 50 行代碼,在最終派生類 D 的構(gòu)造函數(shù)中,除了調(diào)用 B 和 C 的構(gòu)造函數(shù),還調(diào)用了 A 的構(gòu)造函數(shù),這說(shuō)明 D 不但要負(fù)責(zé)初始化直接基類 B 和 C,還要負(fù)責(zé)初始化間接基類 A。

而在以往的普通繼承中,派生類的構(gòu)造函數(shù)只負(fù)責(zé)初始化它的直接基類,再由直接基類的構(gòu)造函數(shù)初始化間接基類,用戶嘗試調(diào)用間接基類的構(gòu)造函數(shù)將導(dǎo)致錯(cuò)誤?,F(xiàn)在采用了虛繼承,虛基類 A 在最終派生類 D 中只保留了一份成員變量 m_a,如果由 B 和 C 初始化 m_a,那么 B 和 C 在調(diào)用 A 的構(gòu)造函數(shù)時(shí)很有可能給出不同的實(shí)參,這個(gè)時(shí)候編譯器就會(huì)犯迷糊,不知道使用哪個(gè)實(shí)參初始化 m_a。

為了避免出現(xiàn)這種矛盾的情況,C++ 干脆規(guī)定必須由最終的派生類 D 來(lái)初始化虛基類 A,直接派生類 B 和 C 對(duì) A 的構(gòu)造函數(shù)的調(diào)用是無(wú)效的。在第 50 行代碼中,調(diào)用 B 的構(gòu)造函數(shù)時(shí)試圖將 m_a 初始化為 90,調(diào)用 C 的構(gòu)造函數(shù)時(shí)試圖將 m_a 初始化為 100,但是輸出結(jié)果有力地證明了這些都是無(wú)效的,m_a 最終被初始化為 50,這正是在 D 中直接調(diào)用 A 的構(gòu)造函數(shù)的結(jié)果。另外需要關(guān)注的是構(gòu)造函數(shù)的執(zhí)行順序。

虛繼承時(shí)構(gòu)造函數(shù)的執(zhí)行順序與普通繼承時(shí)不同:在最終派生類的構(gòu)造函數(shù)調(diào)用列表中,不管各個(gè)構(gòu)造函數(shù)出現(xiàn)的順序如何,編譯器總是先調(diào)用虛基類的構(gòu)造函數(shù),再按照出現(xiàn)的順序調(diào)用其他的構(gòu)造函數(shù);而對(duì)于普通繼承,就是按照構(gòu)造函數(shù)出現(xiàn)的順序依次調(diào)用的。修改本例中第 50 行代碼,改變構(gòu)造函數(shù)出現(xiàn)的順序:

D::D(int a, int b, int c, int d): B(90, b), C(100, c), A(a), m_d(d){ }

雖然我們將 A() 放在了最后,但是編譯器仍然會(huì)先調(diào)用 A(),然后再調(diào)用 B()、C(),因?yàn)?A() 是虛基類的構(gòu)造函數(shù),比其他構(gòu)造函數(shù)優(yōu)先級(jí)高。如果沒有使用虛繼承的話,那么編譯器將按照出現(xiàn)的順序依次調(diào)用 B()、C()、A()。

到此這篇關(guān)于C++中虛繼承時(shí)的構(gòu)造函數(shù)示例詳解的文章就介紹到這了,更多相關(guān)C++虛繼承構(gòu)造函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++實(shí)現(xiàn)假裝藍(lán)屏整蠱小程序

    C++實(shí)現(xiàn)假裝藍(lán)屏整蠱小程序

    因?yàn)楣ぷ鞯男枰?,有時(shí)候我們離開時(shí)并不想讓別人看到我們電腦的內(nèi)容,所以本文為大家分享了一個(gè)基于C++實(shí)現(xiàn)的假裝藍(lán)屏的小程序,需要的可以參考下
    2023-06-06
  • C/C++實(shí)現(xiàn)7bit與8bit編碼互相轉(zhuǎn)換

    C/C++實(shí)現(xiàn)7bit與8bit編碼互相轉(zhuǎn)換

    這篇文章主要為大家詳細(xì)介紹了如何使用C/C++實(shí)現(xiàn)7bit與8bit編碼互相轉(zhuǎn)換功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-10-10
  • 深入理解C++?字符變量取地址的特殊性與內(nèi)存管理機(jī)制詳解

    深入理解C++?字符變量取地址的特殊性與內(nèi)存管理機(jī)制詳解

    在?C++?編程中,字符變量的取地址行為和內(nèi)存布局對(duì)程序行為有著深遠(yuǎn)的影響,尤其是在打印變量地址和訪問(wèn)內(nèi)存內(nèi)容時(shí),本文將給大家介紹C++?字符變量取地址的特殊性與內(nèi)存管理機(jī)制,感興趣的朋友一起看看吧
    2024-12-12
  • C語(yǔ)言選擇排序算法及實(shí)例代碼

    C語(yǔ)言選擇排序算法及實(shí)例代碼

    本篇文章主要介紹了 C語(yǔ)言選擇排序算法,這里提供代碼實(shí)例以便大家理解,通過(guò)本文,更好的理解排序算法
    2016-07-07
  • OpenCV實(shí)現(xiàn)低對(duì)比度圖像臟污區(qū)域檢測(cè)

    OpenCV實(shí)現(xiàn)低對(duì)比度圖像臟污區(qū)域檢測(cè)

    本文主要介紹了OpenCV實(shí)現(xiàn)低對(duì)比度圖像臟污區(qū)域檢測(cè),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 最新評(píng)論