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

  • 相关阅读:
    获取数据——爬取某微博评论
    使用Microsoft Power BI进行基本的数据分析
    Hadoop分布式文件系统
    使用Visual Studio开发Python
    ML:吴恩达 机器学习 课程笔记(Week5~6)
    ML:吴恩达 机器学习 课程笔记(Week7~8)
    ML:吴恩达 机器学习 课程笔记(Week9~10)
    知乎用户报告
    ML:多变量代价函数和梯度下降(Linear Regression with Multiple Variables)
    ML:吴恩达 机器学习 课程笔记(Week1~2)
  • 原文地址:https://www.cnblogs.com/wucg/p/2413034.html
Copyright © 2011-2022 走看看