"The type 'TestI' must implement the inherited pure virtual method"



  • Guten Morgen allerseits,

    ich beschäftige mich grade etwas mit Vererbung und dergleichen. Ich habe eine Klasse Steuerung, diese ist wiefolgt aufgebaut:

    namespace Test
    {
    class Steuerung 
    {
    public:
    
        virtual int Init(const ::std::string&) = 0;
    
        virtual bool IsMotorRunning(int) = 0;
    
        virtual bool Stop(int) = 0;
    
        virtual bool GotoMM(int, float) = 0;
    };
    }
    

    Jetzt möchte ich eine Klasse TestI davon ableiten.

    In der Klasse testI.h habe ich folgendes:

    #ifndef TEST_I_H
    #define TEST_I_H
    
    #include "test.h"
    #include <iostream>
    
    class TestI : public Test::Steuerung
    {
    public:
    	virtual int Init(std::string devname);
    	virtual bool IsMotorRunning(int aMotorNum);
    	virtual bool Stop(int aMotorNum);
    	virtual bool GotoMM(int aMotorNum, float aPositionMM);
    };
    
    #endif
    

    und in der testI.cpp

    #include "testI.h"
    #include <iostream>
    
    using namespace std;
    
    int TestI::Init(string devname){
    	cout << "Init with " << devname << endl;
    	return 0;
    }
    
    bool TestI::IsMotorRunning(int aMotorNum){
    	cout << "IsMotorRunning with " << aMotorNum << endl;
    	return true;
    }
    
    bool TestI::Stop(int aMotorNum){
    	cout << "Stop with " << aMotorNum << endl;
    	return true;
    }
    bool TestI::GotoMM(int aMotorNum, float aPositionMM){
    	cout << "GotoMM with " << aMotorNum << " and " << aPositionMM << endl;
    	return true;
    }
    

    wenn ich nun aber ein Objekt von TestI erstellen will sagt er mir folgendes:

    The type 'TestI' must implement the inherited pure virtual method 'Test::Steuerung::Stop'.

    Ich dachte aber eigentlich, dass ich die Methode Stop ja schon eingebaut habe.
    Die test.h Datei ist mit ihren Namespaces so vorgegeben.

    Ich frage mich jetzt gerade, wie ich den Fehler beheben kann.

    viele Grüße
    Salva


  • Mod

    Ich nehme mal an, dass der erste Codeblock so aussehen sollte:

    namespace Test
    {
      class Steuerung
      {
      public:
    
        virtual int Init(const ::std::string&) = 0;
    
        virtual bool IsMotorRunning(int) = 0;
    
        virtual bool Stop(int) = 0;
    
        virtual bool GotoMM(int, float) = 0;
      }; 
    }
    

    Richtig?

    Zwei Fehler die ich sehe:
    Du hast Stop zweimal definiert. Das kann nicht gehen.
    Die Argumente von Steuerung.Init und TestI.init sind unterschiedlich. Dadurch bleibt Init(const ::std::string&) in TestI weiterhin abstrakt.

    Wie das aber zu der gezeigten Fehlermeldung führen kann ist rätselhaft.

    P.S.: Und deine Init-Methode ist hoffentlich kein Konstruktorersatz.



  • oh ja, das const vom anfang ist eigentlich weg, sorry. Das war noch aus einer vorherigen Version.

    Das 2. Stop hatte ich geschrieben um zu testen, welche er mir im Namespace TestI alle anzeigt.

    Richtig, Steuerung liegt im namespace Test.

    Die Steuerung Klasse ist wie gesagt vorgegeben und auch noch etwas komplexer, die kann ich auch nicht verändern. (Nein es ist keine Hausaufgabe oder sonst was 😉 )

    Danke für die Mühe


  • Mod

    Könntest du dann mal versuchen, den Code soweit wie möglich zu kürzen und dann hier 1:1 die letzte Version zeigen, die den Fehler noch erzeugt? Vielleicht findest du dabei auch selber schon den Fehler.
    Wenn ich nämlich die zwei von mir genannten Sachen korrigiere, funktioniert es. Und selbst wenn ich es nicht tue sind die Fehler, wie schon gesagt, ganz andere.



  • Und: Test::Steuerung sollte einen virtuellen Destruktor bereitstellen.


Anmelden zum Antworten