2017-05-03 5 views
4

Wie in "Die C++ Programmiersprache 3.Edition - Bjarne Stroustrup" geschrieben. Wir können Scope-Lösung verwenden, um Mehrdeutigkeitsfehler zu vermeiden. Das grundlegende Programm, das unten ist, wenn ich 3 Schichtbereich im Klassenmix benutze, tritt ein Fehler auf. Aber wenn ich 2 Schicht kein Problem verwende. Was ist falsch? oder ist es etwas wie Design-Problem? Der Fehler ist;Vererbung in C++, "... ist eine mehrdeutige Basis von ..." Fehler

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; 

Ich möchte kein Diamantmodell machen. Ich bin glücklich mit zwei Basisklassen. Die Sache, die ich gerade lerne, warum es Fehler gibt, wenn ich 3 Schichtbereich verwende. Vielen Dank.

Hinweis: Version ist 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

Vielleicht dupe (es beantwortet Ihr Problem): http://stackoverflow.com/questions/21558/in-c-what-is-a-virtual-base-class – Rakete1111

+0

Es geht nicht um virtuelle. Ich möchte kein Diamantmodell machen. – al0s

+6

Ja, ist es. Ihr Code leidet unter dem Diamond-Problem, das durch virtuelle Vererbung gelöst werden kann. – Rakete1111

Antwort

6

Von qualified_lookup

pervaneli::plane ist der injizierte-class-name plane (der Typ).

so pervaneli::plane::engine ist in der Tat plane::engine, die mehrdeutig ist, wie Sie zwei Basisklasse plane haben.

Sie können dem gewünschten Mitglied keinen vollständigen Pfad geben.

+2

Ja, es ist der Typ, NICHT das Unterobjekt, und notiere den Unterschied zwischen 'this-> pervaneli :: plane :: engine' und' static_cast (this) -> plane: : Motor' –

1

Öffentliche Vererbung bedeutet is a Beziehung.
Referenz: Effective C++: Punkt 32: Stellen Sie sicher, dass öffentliche Vererbung Modelle „ist-a.“

So pervaneli wegen öffentlichen Vererbung ein plane ist. Die Klasse pervaneli hat bereits die Elementvariable engine darin wegen is a Beziehung mit plane.

Durch Hinzufügen des Bereichs von plane machen Sie es für den Compiler mehrdeutig daher der Fehler.