解释代码中的继承?

gui*_*eek 2 c++ multiple-inheritance

有这个代码:

class Base{
    public:
    void disp(){
    cout<<"base"<<endl;
    }
};

class Der1:public Base{
    public:
    void test1(){
    cout<<"der1 test1"<<endl;
    }
};

class Der2:public Base{
    public:
    void test2(){
    cout<<"der2 test2"<<endl;
    }
};

class Der3:public Der1,Der2{
    public:
    void fun(){
    cout<<"Der3 fun"<<endl;
    }
};


int main()
{
    Der3 d;
    d.test1();
}
Run Code Online (Sandbox Code Playgroud)

OUTPUT:der1 test1 //成功打印

但对于

int main()
{
    Der3 d;
    d.test2();
}
Run Code Online (Sandbox Code Playgroud)

它给出了Der2无法访问的错误......

但是,当我将代码更改为

class Base{
        public:
        void disp(){
        cout<<"base"<<endl;
        }
    };

class Der1:public Base{
    public:
    void test1(){
    cout<<"der1 test1"<<endl;
    }
};

class Der2:public Base{
    public:
    void test2(){
    cout<<"der2 test2"<<endl;
    }
};

class Der3:public Der2,Der1{  //***changed the order here*** 
    public:
    void fun(){
    cout<<"Der3 fun"<<endl;
    }
};


int main()
{
    Der3 d;
    d.test2();
}
Run Code Online (Sandbox Code Playgroud)

它输出:der2 Test2

有人能解释一下这里发生了什么吗?

Bra*_*ohn 6

它应该是:

class Der3:public Der2, public Der1{ 
Run Code Online (Sandbox Code Playgroud)

如果未指定访问限定符,则默认为private.

另外,因为您在Der3中继承了两种类型的公共基础,所以您应该在Der1和Der2中使用虚拟继承.这样可以避免复制公共Base成员(如果有的话).

class Der1:public virtual Base{...   
class Der2:public virtual Base{...
Run Code Online (Sandbox Code Playgroud)