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;
}
Vielleicht dupe (es beantwortet Ihr Problem): http://stackoverflow.com/questions/21558/in-c-what-is-a-virtual-base-class – Rakete1111
Es geht nicht um virtuelle. Ich möchte kein Diamantmodell machen. – al0s
Ja, ist es. Ihr Code leidet unter dem Diamond-Problem, das durch virtuelle Vererbung gelöst werden kann. – Rakete1111