12 Stimmen

Die Implementierung und Headerdateien der rein virtuellen Funktion von C++

Ich habe Probleme beim Implementieren reiner virtueller Funktionen, die von einer abstrakten Klasse geerbt wurden, wenn die betreffenden Klassen in *.h und *.cpp Dateien aufgeteilt sind. Der Compiler (g++) gibt mir die Meldung, dass die abgeleitete Klasse aufgrund des Vorhandenseins reiner Funktionen nicht instanziiert werden kann.

/** interface.h**/
namespace ns
{
    class Interface {
        public:
            virtual void method()=0;
    }
}

/** interface.cpp**/
namespace ns
{
    //Interface::method()() //hier nicht implementiert
}

/** derived.h **/
namespace ns
{
    class Derived : public Interface {
        //Anmerkung - siehe unten
    }
}

/** derived.cpp **/
namespace ns
{
    void Derived::Interface::method() { /*etwas tun*/ }
}

/** main.cpp **/
using namespace ns;
int main()
{
    Interface* instanz = new Derived; //Compilerfehler
}

Bedeutet das, dass ich die Methode() zweimal deklarieren muss - im *.h der Interface und auch im derived.h? Gibt es keinen anderen Weg?

17voto

robert Punkte 31314

Sie müssen Ihre Methode in der Unterklasse deklarieren.

// interface.hpp
class Interface {
public:
    virtual void method()=0;
}

// derived.hpp
class Derived : public Interface {
public:
    void method();
}

// derived.cpp
void
Derived::method()
{
    // etwas tun
}

16voto

Lightness Races in Orbit Punkte 367630

Sie haben vergessen, Derived::method() zu deklarieren.

Sie haben versucht, es zumindest zu definieren, aber stattdessen Derived::Interface::method() anstelle von Derived::method() geschrieben, aber Sie haben nicht einmal versucht, es zu deklarieren. Daher existiert es nicht.

Daher hat Derived kein method(), daher wurde die reine virtuelle Funktion method() von Interface nicht überschrieben... und daher ist Derived auch rein virtuell und kann nicht instanziiert werden.

Außerdem ist public void method()=0; kein gültiges C++; es sieht eher wie Java aus. Reine virtuelle Elementfunktionen müssen tatsächlich virtual sein, aber Sie haben nicht virtual geschrieben. Und Zugriffsspezifizierer werden von einem Doppelpunkt gefolgt:

public:
    virtual void method() = 0;

0voto

алекс кей Punkte 801

Sie haben den Konstruktor auch nicht korrekt aufgerufen - es ist auch eine Methode;

 Interface* instance = new Derived;

Sollte sein

 Interface* instance = new Derived();

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