5 Stimmen

Schnittstellen in C++

Ich würde gerne Schnittstellen in C++ wie in Java oder C# verwenden. Ich habe beschlossen, rein abstrakte Klassen mit Mehrfachvererbung zu verwenden, aber irgendetwas ist furchtbar falsch, wenn ich die Schnittstelle spezialisiere:

class Interface
{
public:
  virtual int method() = 0;
};

// Default implementation.
class Base: virtual public Interface
{
public:
  virtual int method() {return 27;}
};

// specialized interface
class Interface2: public Interface
{
public:
  virtual int method() = 0;
// some other methods here
};

// concrete class - not specialised - OK
class Class: public virtual Interface, public virtual Base
{
};

// concrete class - specialised
class Class2: public Interface2, public Base
{
};

int main()
{
  Class c;
  Class2 c2;
return 0;
}

Warnung 1 Warnung C4250: 'Klasse' : erbt 'Base::Base::method' über Dominanz 30

Fehler 2 Fehler C2259: 'Klasse2': kann abstrakte Klasse nicht instanziieren 42

Wie geht man dabei richtig vor?

2voto

Daniel Daranas Punkte 22022

Diese Antwort in einem anderen Forum scheint genau das von Ihnen erwähnte Problem zu behandeln.

1voto

Aaron Saarela Punkte 3816

Im Allgemeinen sollten Sie das Rautendichte-Muster vermeiden:

            Interface
            /      \
          Base   Interface2
            \      /
             Class2

Wenn Sie nicht aufpassen, wird Ihnen das später viel Ärger einbringen. Zweideutigkeit wird Sie beißen.

In Ihrem speziellen Fall gibt es keine Notwendigkeit für Interface2, von Interface zu erben. Interface2 muss keine "Methode" angeben, da es abstrakt ist. Entfernen Sie die Vererbung zwischen Interface und Interface2, um den Diamanten zu brechen. Dann sieht Ihre Hierarchie wie folgt aus:

        Interface                Interface  Interface2
           |                          |       |
          Base                      Base      |
           |                           \      /
         Class                          Class2

Und so sieht Ihre Umsetzung aus:

// concrete class - not specialised - OK
class Class: public Base
{
};

// concrete class - specialised
class Class2: public Base, public Interface2
{
    virtual int method() {return 35;}

    virtual void Inteface2Method { ... }
};

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X