Ha, ha, dieses Problem kitzelt etwas, das irgendwo tief in meinem Kopf vergraben ist. Ich kann es nicht genau benennen, aber ich denke, es hat mit der Definition einer Schnittstellenhierarchie und der Vererbung sowohl einer Schnittstelle als auch einer Implementierung zu tun. Man vermeidet dann, dass man alle Funktionen mit implementieren muss, indem man Aufrufe an eine Basisklasse weiterleitet. Denke ich.
Ich denke, dieses einfache Beispiel zeigt dasselbe, ist aber vielleicht etwas leichter zu verstehen, weil es Dinge verwendet, die leicht zu visualisieren sind: (bitte verzeihen Sie die Strukturfaulheit)
#include <iostream>
using namespace std;
struct Vehicle
{
virtual void Drive() = 0;
};
struct VehicleImp : virtual public Vehicle
{
virtual void Drive()
{
cout << "VehicleImp::Drive\n";
}
};
struct Tank : virtual public Vehicle
{
virtual void RotateTurret() = 0;
};
struct TankImp : public Tank, public VehicleImp
{
virtual void RotateTurret()
{
cout << "TankImp::RotateTurret\n";
}
// Could override Drive if we wanted
};
int _tmain(int argc, _TCHAR* argv[])
{
TankImp myTank;
myTank.Drive(); // VehicleImp::Drive
myTank.RotateTurret(); // TankImp::RotateTurret
return 0;
}
TankImp hat im Wesentlichen die Schnittstelle Tank und die Implementierung Vehicle geerbt.
Nun, ich bin mir ziemlich sicher, dass dies in OO-Kreisen eine bekannte und akzeptable Sache ist (aber ich weiß nicht, ob es einen schicken Namen hat), so dass die gefürchtete Diamant-Sache in diesem Fall in Ordnung ist, und Sie können die Dominanz-Warnung sicher unterdrücken, weil es das ist, was Sie in diesem Fall passieren wollen.
Ich hoffe, das hilft Ihnen, die richtige Richtung einzuschlagen!
Übrigens wurde Ihr Code nicht kompiliert, weil Sie die rein virtuelle "Methode" in Klasse2 nicht implementiert hatten.
EDIT:
Ok, ich glaube, ich verstehe Ihr Problem jetzt besser, und ich denke, der Fehler liegt in Interface2. Versuchen Sie, es in dieses zu ändern:
// specialized interface
class Interface2: public virtual Interface // ADDED VIRTUAL
{
public:
//virtual int method() = 0; COMMENTED THIS OUT
// some other methods here
};
Interface2 sollte nicht die rein virtuelle Definition der Methode haben, da diese bereits in Interface enthalten ist.
Die Vererbung von Interface muss virtuell sein, sonst gibt es eine Mehrdeutigkeit mit Base::method, wenn man von Interface2 und Base in Class2 ableitet.
Jetzt sollten Sie feststellen, dass es kompiliert wird, möglicherweise mit Dominanzwarnungen, und wenn Sie c2.method() aufrufen, erhalten Sie 27.