zoukankan      html  css  js  c++  java
  • 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 继承为避免多继承时子类产生多副本而产生。

  • 相关阅读:
    【BZOJ1053】[HAOI2007]反素数
    【BZOJ1052】[HAOI2007]覆盖问题
    【BZOJ1051】[HAOI2006]受欢迎的牛
    【BZOJ1050】[HAOI2006]旅行
    laravel 操作多数据库总结
    微服务浅述---架构演进
    分布式锁
    laravel自动生成model
    springboot集成quartz实现任务调度
    laravel 队列服务使用总结
  • 原文地址:https://www.cnblogs.com/wucg/p/2413034.html
Copyright © 2011-2022 走看看