这段代码:
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
有人能解释一下这里发生了什么吗?
答案 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