C++ virtual inherit, 虛基類

來源:互聯網
上載者:User
#include <iostream>using namespace std;class A{public:    int m_a;    A(int a):m_a(a){        cout<<"A 構造"<<endl;    }    void introA(){        cout<<"m_a:"<<m_a<<endl;    }};class B1:public A{public:    int m_b1;    B1(int a,int b1):A(a),m_b1(b1){        cout<<"B1 構造"<<endl;    }    void introB1(){        cout<<"m_a:"<<m_a<<",m_b1:"<<m_b1<<endl;    }    void setA_by_b1(int ia){        m_a = ia;    }};class B2:public A{      //無virtualpublic:    int m_b2;    B2(int a,int b2):A(a),m_b2(b2){        cout<<"B2 構造"<<endl;    }    void introB2(){        cout<<"m_a:"<<m_a<<",m_b2:"<<m_b2<<endl;    }    void setA_by_b2(int ia){        m_a = ia;    }};class C:public B1,public B2{public :    int m_c;    C(int a,int b1,int b2,int c):B1(a,b1),B2(a,b2),m_c(c){      //無A的構造        cout<<"C 構造"<<endl;    }    void introC(){        cout<<"B1::m_a:"<<B1::m_a<<endl     //此處有限定符B1::            <<"B2::m_a:"<<B2::m_a<<endl            <<",m_b1:"<<m_b1<<",m_b2:"<<m_b2<<",m_c:"<<m_c<<endl;    }};class D:public C{public :    int m_d;    D(int a,int b1,int b2,int c,int d):C(a,b1,b2,c),m_d(d){      //無A的構造        cout<<"D 構造"<<endl;    }    void introC(){        cout<<"B1::m_a:"<<B1::m_a<<endl     //此處有限定符B1::            <<"B2::m_a:"<<B2::m_a<<endl            <<",m_b1:"<<m_b1<<",m_b2:"<<m_b2<<",m_c:"<<m_c<<endl            <<",m_d:"<<m_d<<endl;    }};int main(){    //A a(1);    //a.introA();    cout<<"*****************************"<<endl;    D c(1,21,22,3,4);    cout<<"*****************************"<<endl;    c.introC();    cout<<"*****************************"<<endl;    c.setA_by_b1(10);    c.setA_by_b2(11);    c.introC();    cout<<"*****************************"<<endl;    return 0;}

  輸出結果為:

*****************************
A 構造
B1 構造
A 構造
B2 構造
C 構造
D 構造
*****************************
B1::m_a:1
B2::m_a:1
,m_b1:21,m_b2:22,m_c:3
,m_d:4
*****************************
B1::m_a:10
B2::m_a:11
,m_b1:21,m_b2:22,m_c:3
,m_d:4
*****************************

從以上看出,d對象含 有兩份類A成員的副本。

再將程式改為virtual public 繼承

#include <iostream>using namespace std;class A{public:    int m_a;    A(int a):m_a(a){        cout<<"A 構造"<<endl;    }    void introA(){        cout<<"m_a:"<<m_a<<endl;    }};class B1:virtual public A{public:    int m_b1;    B1(int a,int b1):A(a),m_b1(b1){        cout<<"B1 構造"<<endl;    }    void introB1(){        cout<<"m_a:"<<m_a<<",m_b1:"<<m_b1<<endl;    }    void setA_by_b1(int ia){        m_a = ia;    }};class B2:virtual public A{      //無virtualpublic:    int m_b2;    B2(int a,int b2):A(a),m_b2(b2){        cout<<"B2 構造"<<endl;    }    void introB2(){        cout<<"m_a:"<<m_a<<",m_b2:"<<m_b2<<endl;    }    void setA_by_b2(int ia){        m_a = ia;    }};class C:public B1,public B2{public :    int m_c;    C(int a,int b1,int b2,int c):A(a),B1(a,b1),B2(a,b2),m_c(c){      //有A的構造        cout<<"C 構造"<<endl;    }    void introC(){        cout<<"B1::m_a:"<<B1::m_a<<endl     //此處有限定符B1::            <<"B2::m_a:"<<B2::m_a<<endl            <<",m_b1:"<<m_b1<<",m_b2:"<<m_b2<<",m_c:"<<m_c<<endl;    }};class D:public C{public :    int m_d;    D(int a,int b1,int b2,int c,int d):A(a),C(a,b1,b2,c),m_d(d){      //有A的構造        cout<<"D 構造"<<endl;    }    void introC(){        cout<<"B1::m_a:"<<B1::m_a<<endl     //此處有限定符B1::            <<"B2::m_a:"<<B2::m_a<<endl            <<",m_b1:"<<m_b1<<",m_b2:"<<m_b2<<",m_c:"<<m_c<<endl            <<",m_d:"<<m_d<<endl;    }};int main(){    //A a(1);    //a.introA();    cout<<"*****************************"<<endl;    D c(1,21,22,3,4);    cout<<"*****************************"<<endl;    c.introC();    cout<<"*****************************"<<endl;    c.setA_by_b1(10);    c.setA_by_b2(11);    c.introC();    cout<<"*****************************"<<endl;    return 0;}

  輸出結果為:

*****************************
A 構造
B1 構造
B2 構造
C 構造
D 構造
*****************************
B1::m_a:1
B2::m_a:1
,m_b1:21,m_b2:22,m_c:3
,m_d:4
*****************************
B1::m_a:11
B2::m_a:11
,m_b1:21,m_b2:22,m_c:3
,m_d:4
*****************************

 從上可以看出,d中只有一個A的副本。

 

結語:virtual 繼承為避免多繼承時子類產生多副本而產生。

 

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.