C ++中的继承," ...是...的模糊基础。错误

时间:2017-05-03 17:21:45

标签: c++

编写于" 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;
    }

2 个答案:

答案 0 :(得分:6)

来自qualified_lookup

pervaneli::plane是注入类名plane(类型)。

所以pervaneli::plane::engine实际上是plane::engine,因为你有两个基类plane,所以这是不明确的。

您无法提供所需成员的完整路径。

答案 1 :(得分:1)

公共继承意味着is a关系。
参考:有效的C ++:第32项:确保公共继承模型“是-a。”

因为公共继承,pervaneliplane。由于pervaneliengine的关系,is a类已包含成员变量plane

通过添加plane的范围,您使编译器模糊不清,从而导致错误。