C++ virtual inherit, 虚基类

#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{      //无virtual
public:
    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{      //无virtual
public:
    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 继承为避免多继承时子类产生多副本而产生。

 

 

 

 

posted @ 2012-03-23 01:01  庚武  Views(319)  Comments(0Edit  收藏  举报