• 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 继承为避免多继承时子类产生多副本而产生。

  • 相关阅读:
    【转】很全的TeeChart for .NET中文教程
    对比两个flash金融图表Stock Chart vs AnyStock
    FusionCharts实例大全
    [译]金融图表AnyStock的9个使用技巧
    看懂SqlServer查询计划
    怎样修改MySQL的默认编码
    VS2003+自带水晶报表的打包部署(CS方式)
    ADO.NET 连接池理解
    临时表 & 表变量
    Eclipse 快捷键介绍
  • 原文地址:https://www.cnblogs.com/wucg/p/2413034.html
Copyright © 2020-2023  润新知