Mehrdeutigkeit bei Mehrfachvererbung von interfaces in C++

Machte ich einen test-code wie folgt:

#include <iostream>
using namespace std;

#ifndef interface
#define interface struct
#endif

interface Base
{
    virtual void funcBase() = 0;
};

interface Derived1 : public Base
{
    virtual void funcDerived1() = 0;
};

interface Derived2 : public Base
{
    virtual void funcDerived2() = 0;
};

interface DDerived : public Derived1, public Derived2
{
    virtual void funcDDerived() = 0;
};

class Implementation : public DDerived
{
public:
    void funcBase() { cout << "base" << endl; }
    void funcDerived1() { cout << "derived1" << endl; }
    void funcDerived2() { cout << "derived2" << endl; }
    void funcDDerived() { cout << "dderived" << endl; }
};

int main()
{
    DDerived *pObject = new Implementation;
    pObject->funcBase();

    return 0;
}

Der Grund, warum ich schrieb diesen code zu testen, ob die Funktion funcBase() aufgerufen werden kann in eine Instanz von DDerived oder nicht. Meine C++ - complier (Visual Studio 2010) gab mir eine Fehlermeldung kompilieren, wenn ich versuchte, um diesen code zu kompilieren. Meiner Meinung nach, ist es kein problem, in diesem code, denn es ist sicher, dass die Funktion funcBase() umgesetzt werden (also überschrieben) in einigen abgeleiteten Klasse von der Schnittstelle DDerived, denn es ist rein virtuell. In anderen Worten, jedes Zeiger-variable vom Typ Implementation * sollte verbunden sein mit einer Instanz einer Klasse, die Implementierung und überschreiben der Funktion funcBase().

Meine Frage ist, warum der compiler mir eine solche Fehlermeldung? Warum das C++ - syntax definiert, wie, dass; D. H., zur Behandlung von diesem Fall als ein Fehler? Wie kann ich den code ausgeführt? Ich möchte Mehrfachvererbung von Schnittstellen. Natürlich, wenn ich "virtuellen öffentlichkeit" oder re-deklarieren Sie die Funktion funcBase() im Implementation wie

interface DDerived : public Derived1, public Derived2
{
    virtual void funcBase() = 0;
    virtual void funcDDerived() = 0;
};

dann läuft alles ohne problem.

Aber ich will nicht zu tun, und auf der Suche nach mehr bequeme Methode, da die virtuelle Vererbung kann sich verschlechtern die Leistung und die re-Erklärung ist so mühsam, Sie zu tun, wenn die Vererbung Beziehungen zwischen Klassen sind sehr Komplex. Gibt es irgendwelche Methoden, damit mehrfache Vererbung von Schnittstellen in C++ zu verwenden, mit virtuellen Vererbung?

  • Meine psychischen Kräfte sagen mir, dass der Fehler Aufruf mehrdeutig Basisklasse Funktion.
  • Aber es ist nicht eine base-Klasse, es ist entweder ein base-Schnittstelle oder eine Basis-Struktur.
  • mögliche Duplikate von C++ - Mehrfachvererbung - warum Sie nicht arbeiten?
  • "es ist sicher, dass die Funktion funcBase() implementiert (und damit überschrieben) in einige abgeleitete Klasse das interface Implementation" - das ist wahr. Jedoch, das problem in Ihrem Fall ist, dass es mehr als einen, und der compiler kann nicht entscheiden, welche Sie wollen für Sie. Sie müssen springen durch einige Reifen (zum Beispiel durch den Umbau der Zeiger auf die Basis, die Sie wollen) zu machen, die Wahl ausdrücklich an.
  • Da Ihr interfaces sind eigentlich structs können Sie weglassen die public beim vererben.
  • Was ich jedoch argumentiert, dass eine der beiden Möglichkeiten sollte man eventuell identisch für den Fall, dass die Funktion ist rein virtuell, so denke ich, kann es gut sein, wenn der compiler wissen das....

InformationsquelleAutor user1361349 | 2012-04-27
Schreibe einen Kommentar