编写于" C ++编程语言3.Edition - Bjarne Stroustrup"。我们可以使用范围解决方案来防止歧义错误。下面的基本程序,当我在类混合使用3层范围时发生错误。但是,当我使用2层没有问题。怎么了?还是像设计问题?错误是;
deneme.cpp: In constructor ‘mix::mix(std::__cxx11::string, int)’:
deneme.cpp:45:22: error: ‘plane’ is an ambiguous base of ‘mix’
pervaneli::plane::engine=b;
我不想制作钻石模型。我很满意两个基础(平面)课程。我只是想了解为什么当我使用3层范围时它会出错。感谢。
注意:版本是g ++(Ubuntu 5.4.0-6ubuntu1~16.04.4)5.4.0 20160609
#include<iostream>
#include<string>
using namespace std;
class plane{
protected:
int speed;
string name;
public:
int engine;
void its_name(){
cout<<name<<endl;
}
plane(int a=10000){
engine=a;
}
};
class pervaneli:public plane{
public:
pervaneli(string a="-"){
name=a;
}
void belirle(int x){
speed=x;
}
};
class jet:public plane{
public:
jet(string a="-"){
name=a;
}
void belirle(int x){
speed=x;
}
};
class mix: public pervaneli,public jet{
public:
mix(string a,int b){
jet::name=a;
pervaneli::name=a;
pervaneli::plane::engine=b; //ambigous base error
//pervaneli::engine=b; /*works fine*/
}
void belirle(int x){
jet::speed=x;
}
};
int main()
{
mix a400m("Alp",9999);
a400m.belirle(500);
a400m.pervaneli::its_name();
return 0;
}
答案 0 :(得分:6)
pervaneli::plane
是注入类名plane
(类型)。
所以pervaneli::plane::engine
实际上是plane::engine
,因为你有两个基类plane
,所以这是不明确的。
您无法提供所需成员的完整路径。
答案 1 :(得分:1)
公共继承意味着is a
关系。
参考:有效的C ++:第32项:确保公共继承模型“是-a。”
因为公共继承,pervaneli
是plane
。由于pervaneli
与engine
的关系,is a
类已包含成员变量plane
。
通过添加plane
的范围,您使编译器模糊不清,从而导致错误。