As written in "The C++ Programming Language 3.Edition - Bjarne Stroustrup". We can use scope solution to prevent ambiguity errors. The basic program which is in below, when i use 3 layer scope in class mix an error occurs. But when i use 2 layer no problem. What is wrong? or is it something like design issue? The error is;
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;
I don't want to make a diamond model. I am happy with two base (plane) classes. The thing that i just want to learn why it gives error when i use 3 layer scope. Thanks.
Note: Version is 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;
}
From qualified_lookup
pervaneli::plane
is the injected-class-name plane
(the type).
so pervaneli::plane::engine
is in fact plane::engine
, which is ambiguous as you have two base class plane
.
You cannot give full path to the member you want.
Public inheritance means is a
relationship.
Reference: Effective C++: Item 32: Make sure public inheritance models “is-a.”
So pervaneli
is a plane
because of public inheritance. The class pervaneli
already has the member variable engine
in it because of is a
relationship with plane
.
By adding the scope of plane
you are making it ambiguous for the compiler hence the error.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With