• 多继承


    C++允许为一个派生类指定多个基类,这样的继承结构被称做多重继承,此时派生类有两个或两个以上的直接基类。

    虚基类与二义性

    菱形继承可能会存在二义性

    int main( )
    {
        DC d;
        d.x = 1;       // error C2385: 对"x"的访问不明确
             //可能是"x"(位于基"BC1"中),也可能是"x"(位于基"BC2"中)
        d.BC1::x = 2;   // OK,from BC1
        d.BC2::x = 3;   // OK,from BC2
        d.K = 4;           // error C2385: 对"K"的访问不明确
        d.BC1::K = 5;  // OK,from BC1
        d.BC2::K = 6;  // OK,from BC2
        return 0;
    }
    

    解决方法:采用虚继承,在BC1类和BC2类继承BC0时,其前面加上virtual关键字就可以实现虚拟继承,使用虚拟继承后,当系统碰到多重继承的时候就会先自动加一个BC0的拷贝,当再次请求一个BC0的拷贝时就会被忽略,以保证继承类成员函数的唯一性。

    class BC0
    {
    public:
        int K;
    };
    class BC1 : virtual public BC0
    {
    public:
        int x;
    };
    class BC2 : virtual public BC0
    {
    public:
        int x;
    };
    class DC : public BC1, public BC2
    {
    };
    void main( )
    {
        DC d;       //虚继承使得BC0仅被DC间接继承一份
        d.K = 13;    // OK
    }
    

    多继承下的构造函数

    #include<iostream>
    using namespace std;
    class B1
    {
    public:
        B1(int i)
        {
            cout<<"B1"<<endl;
        }
    };
    class B2
    {
    public:
        B2(int i)
        {
            cout<<"B2"<<endl;
        }
    };
    class B3
    {
    public:
        B3(int i)
        {
            cout<<"B3"<<endl;
        }
    };
    class B4
    {
    public:
        B4(int i)
        {
            cout<<"B4"<<endl;
        }
    };
    class D : public B2, virtual B1, public B4, virtual B3
    {
    public:
        D(int n): B1(n), B2(n), B3(n), B4(n) {}
    };
    int main( )
    {
        D d(1);
        return 0;
    }
    
    执行结果:
    
    B1
    B3
    B2
    B4
    

    在同一层次中,先调用虚基类的构造函数,接下来依次是非虚基类的构造函数,然后是派生类的构造函数。
    若同一层次中包含多个虚基类,这些虚基类的构造函数按对它们声明的先后次序调用;非虚基类也是按照它们的声明先后次序调用

    参考
    https://www.cnblogs.com/wkfvawl/p/10756539.html

  • 相关阅读:
    一周信创舆情观察(11.2~11.8)
    一周信创舆情观察(10.26~11.1)
    一周信创舆情观察(10.19~10.25)
    一周信创舆情观察(10.12~10.18)
    Python脚本导出AWS EC2资源清单
    C++typename的由来和用法
    百篇已过,又是一个新篇章,谈谈感受吧
    【硬件篇之电源纹波噪声测试】
    C++的转换手段并与explicit关键词配合使用
    shell脚本的使用该熟练起来了,你说呢?(篇二)
  • 原文地址:https://www.cnblogs.com/hunter-w/p/13260417.html
Copyright © 2020-2023  润新知