解释代码中的继承?

时间:2014-07-25 14:08:37

标签: 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();
}

OUTPUT:der1 test1 //成功打印

但是

int main()
{
    Der3 d;
    d.test2();
}

它给出了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();
}

输出:der2 Test2

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

4 个答案:

答案 0 :(得分:6)

应该是:

class Der3:public Der2, public Der1{ 

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

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

class Der1:public virtual Base{...   
class Der2:public virtual Base{...

答案 1 :(得分:4)

您必须为每个基类添加辅助功能:

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

当您切换订单时,Der2是公共基础,但Der1是私有的。

答案 2 :(得分:3)

class Der3:public Der1,Der2 {

公众&#39;对下一个基地只有好处。你想写:

class Der3: public Der1, public Der2 {

此外,应该注意的是,这个例子也显示了致命的钻石&#34;继承模式,所以它的设计师显然应该被打耳光。

答案 3 :(得分:3)

默认情况下,类继承是私有的。所以:

class Der3: public Der1, Der2

与:

相同
class Der3: public Der1, private Der2

您需要对两个基类使用公共继承:

class Der3: public Der1, public Der2